我目前正在处理基于SigFox的物联网设备,该设备可以发送有效载荷最大为12字节的消息。这意味着芯片制造商通常必须具有创造性。我目前正在处理一条看起来像这样的消息:
typedef struct {
byte MsgId; // Message Identification Value = 0x01
unsigned int Start :1; // Start Message
unsigned int Move :1; // Object Moving
unsigned int Stop :1; // Object Stopped
unsigned int Vibr :1; // Vibration Detected
int16 Temp; // Temperature in 0,01 degC
byte GPSFixAge; // bit 0..7 = Age of last GPS Fix in Minutes,
byte SatCnt_HiLL; // bit 0..4 = SatInFix, bit5 Latitude 25 bit 6,7 = Longitude 25,26
byte Lat[3]; // bit 0..23 = latitude bit 0..23
byte Lon[3]; // bit 0..23 = longitude bit 0..23
}
我认为Start-Move-Stop-Vibr数据可能被解释为布尔值,但它被编码为bitfield半字节以节省空间。我唯一不知道的是我是否应该考虑开始成为最不重要或最重要的一点。 F.e:
0x 00 8 ...
此处的8表示Start-Move-Stop-Vibr数据,其中最高有效位最高。但这是否意味着消息属于Start类型,或者更确切地说是Vibr?
答案 0 :(得分:0)
我认为Start-Move-Stop-Vibr数据可能被解释为布尔值,但它被编码为位域半字节以节省空间。
相反,他们尝试使用位字段对某个二进制表示进行建模。这是高度特定于编译器的,因此像这样的代码只能在某个给定的编译器上工作。
我唯一不知道的是我是否应该考虑开始成为最不重要或最重要的位
您无法知道标准未指定哪个最重要的位。此外,CPU(以及可能的网络协议)endianess可能会在这里发挥作用。
了解这一点的唯一方法是阅读特定的编译器文档。
这就是为什么一般的结构和特定的位字段不适合映射原始二进制数据的原因。编写此代码的唯一可移植方法是使用原始uint8_t
数组缓冲区,然后可以将其反序列化为各种变量。