0

我正在使用一对 MRF24J40 无线电芯片来让一个 PIC32 微控制器板通过射频传输与另一个板进行通信。我的所有代码都可以正常编译,但我不断收到与此代码相关的错误。

typedef struct
    {
        union
        {
            BYTE        Val;  
            struct
            {
                BYTE    packetType      :2;             // type of packet. Possible types are
                                                        // * PACKET_TYPE_DATA - Data type
                                                        // * PACKET_TYPE_COMMAND -  Command type
                                                        // * PACKET_TYPE_ACK -  Acknowledgement type
                                                        // * PACKET_TYPE_RESERVE - Reserved type
                BYTE    broadcast       :1;             // 1: broadcast, 0: unicast
                BYTE    secEn           :1;             // 1: secure the MAC payload, 0: send plain text
                BYTE    repeat          :1;             // 1: allow repeaters to forward the message, 0: send message directly
                BYTE    ackReq          :1;             // 1: acknowledgement required, 0: no acknowldgement
                BYTE    destPrsnt       :1;             // 1: destination address in the packet, 0: destination address not in the packet
                BYTE    sourcePrsnt     :1;             // 1: source address in the packet, 0: source address not in the packet
            } bits;
        } flags;

        BYTE *      SourceAddress;                      // Address of the Sender
        BYTE *      Payload;                            // Pointer to the payload
        BYTE        PayloadLen;                         // Payload size
        BYTE        RSSIValue;                          // RSSI value for the received packet
        BYTE        LQIValue;                           // LQI value for the received packet
        #if defined(IEEE_802_15_4)
            BOOL        altSourceAddress;               // Source address is the alternative network address
            WORD_VAL    SourcePANID;                    // PAN ID of the sender
        #endif
    } MAC_RECEIVED_PACKET;

基本上我已经尝试了地球上的所有方法来更改变量packetType,secEnackReq的值。我尝试在声明后直接更改值,但这似乎是位长度,而不是值。代码(直接来自微芯片的网站)有注释说 1 = this 和 0 = that 但我还没有找到可以更改这些值的任何地方。任何熟悉这些 MRF24J40 芯片的人的帮助将不胜感激。谢谢你。

4

2 回答 2

0

我认为这与您的微控制器没有任何特定关系,只是您可能不熟悉如何struct以及union用于在 C 中定义位域。

MAC_RECEIVED_PACKET是一个struct有一个名为 的字段flagsflagsunion介于 aBYTEstruct称为 的位域之间的一个bits

在声明中,每个字段后bits跟它的位长。因此,例如,2 位的 packetType 可以取值 0、1、2、3。您可以像这样设置值:

MAC_RECEIVED_PACKET foo;
foo.flags.bits.packetType = 3;
foo.flags.bits.secEn      = 1;
/* etc. */
于 2014-04-17T18:30:02.243 回答
0

取决于您说尝试更改值时的意思..例如,如果您要选择数据包类型并设置 PACKET_TYPE_ACK - 确认类型:

MAC_RECEIVED_PACKET myrpacket; 

myrpacket.flags.bits.packetType=2;

packetType 可以采用以下值:

00 =0 --> PACKET_TYPE_DATA
01 =1 --> PACKET_TYPE_COMMAND
10 =2 --> PACKET_TYPE_ACK
11 =3 --> PACKET_TYPE_RESERVE

为什么?

bits 是一个 BYTE 数据,而 packetType 是这个字节的前 2 位,如结构中所声明的:

  BYTE    packetType      :2;

所以如果你想设置 ackReq

  myrpacket.flags.bits.ackReq=1;

希望这对你有帮助

于 2014-04-17T18:32:18.210 回答