
一句话: 大端协议的帧数据不能直接 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; // 读出来不是 98ARM 是 LE——低地址字节当低位。u8Frame[5]0x00、u8Frame[6]0x62→ LE 拼成0x620025088。完全不是 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 序。有用的话点个收藏下次调试直接用。有问题欢迎评论区交流看到了都会回。