首先,我还是个学生。所以我不是很有经验。
我正在使用一个蓝牙硬件,我正在使用它的协议向它发送命令。该协议要求每个数据包字段首先发送具有 LSB 的数据包。
我收到错误数据包,表明我的 CRC 值错误,所以我做了一些调查。我发现了问题,但在这个过程中我变得困惑。
这是一些 GDB 输出和其他信息,说明了我的困惑。
我正在发送一个应该如下所示的数据包:
|Start Flag| Packet Num | Command | Payload | CRC | End Flag|
0xfc 0x1 0x0 0x8 0x0 0x5 0x59 0x42 0xfd
这是一些 GDB 输出:
print /x reqId_ep
$1 = {start_flag = 0xfc, data = {packet_num = 0x1, command = {0x0, 0x8}, payload = {
0x0, 0x5}}, crc = 0x5942, end_flag = 0xfd}
reqId_ep 是我发送的数据包的变量名。那里看起来一切都很好,但是我从它那里收到了 CRC 错误代码,所以一定有问题。
在这里,我从要发送的数据包的地址开始检查 9 个十六进制字节:
x/9bx 0x7fffffffdee0
0xfc 0x01 0x00 0x08 0x00 0x05 0x42 0x59 0xfd
问题在这里变得很明显。CRC 不是 LSB 在前的。(0x42 0x59)
为了解决我的问题,我删除了我设置我的 CRC 值等于的 htons()。
这是上面没有 htons() 的相同输出:
p/x reqId_ep
$1 = {start_flag = 0xfc, data = {packet_num = 0x1, command = {0x0, 0x8}, payload = {
0x0, 0x5}}, crc = 0x4259, end_flag = 0xfd}
这里的 CRC 值不是 LSB。
但是之后:
x/9bx 0x7fffffffdee0
0xfc 0x01 0x00 0x08 0x00 0x05 0x59 0x42 0xfd
这里的 CRC 值是 LSB 在前。
那么显然 C 的存储首先是 LSB?对于这种情况,有人可以向我投射知识吗?非常感谢你。