我正在使用一对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,secEn,ackReq等的值。我试着在他们声明之后直接改变值,但这似乎是位长度,而不是值。代码(直接从microchip的网站)有注释1= this和0=那个,但我没有找到可以更改这些值的地方。任何熟悉这些MRF24J40芯片的人的帮助都将不胜感激。谢谢。
发布于 2014-04-18 02:30:02
我不认为这与您的微控制器有任何特定的关系,只是您可能不熟悉如何使用struct和union在C中定义位域。
MAC_RECEIVED_PACKET是一个struct,它有一个名为flags的字段。flags是BYTE和名为bits的struct位字段之间的union。
在声明中,bits中的每个字段后面都跟有它的位长度。因此,例如,2位的packetType可以采用值0、1、2、3。您可以这样设置这些值:
MAC_RECEIVED_PACKET foo;
foo.flags.bits.packetType = 3;
foo.flags.bits.secEn = 1;
/* etc. */发布于 2014-04-18 02:32:18
这取决于您说您试图更改值时的意思。例如,如果您想选择数据包类型并设置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是字节数据,packetType是该字节的前2位,如结构中声明的那样:
BYTE packetType :2;因此,如果您想要设置ackReq
myrpacket.flags.bits.ackReq=1;希望这能对你有所帮助
https://stackoverflow.com/questions/23140087
复制相似问题