一句话: 大端协议的帧数据不能直接 cast 成结构体指针——ARM 是 Little-Endian,读
uint16会高低字节反转。正确做法是从字节数组逐字节提取。
适合谁读:串口/SPI/I2C 收到数据后直接
*(uint16_t*)pBuf读值的嵌入式开发者。
现象
协议用 Big-Endian 传两字节的控制 ID。帧里是0x00 0x62(=十进制的 98)。
// 错误写法:直接 cast 结构体 CTRL_MSG *pMsg = (CTRL_MSG *)u8Frame; uint16_t id = pMsg->control_id; // 读出来不是 98!ARM 是 LE——低地址字节当低位。u8Frame[5]=0x00、u8Frame[6]=0x62→ LE 拼成0x6200=25088。完全不是 98。
正确做法
// 从字节数组逐字节提取 Big-Endian uint16 uint16_t id = ((uint16_t)u8Frame[5] << 8) | u8Frame[6]; // 0x0062 = 98不依赖处理器字节序。不管 ARM LE 还是其他 BE——手动拼接的结果是确定的。
发送方向也检查
发送代码通常已经是大端输出(>>8 | &0xFF),但如果是结构体赋值→memcpy 到发送 buffer——同样的坑。发送用pMsg->id = 98; memcpy(buf, &pMsg, len)→ 线路上收到的是 LE 序。
有用的话点个收藏,下次调试直接用。有问题欢迎评论区交流,看到了都会回。