# 校验算法修改说明 ## 修改原因 链接错误: `Undefined symbol HIDO_CRC16Modbus` 原因: 项目中 `HIDO_ModbusCRC16.h` 声明了 `HIDO_ModbusCRC16()` 函数,但该函数没有实现(缺少 .c 源文件)。 ## 解决方案 将校验算法从 **CRC16-MODBUS** 改为 **16位累加校验和 (Checksum_u16)**。 ### 优势 1. **无外部依赖**: 不需要 CRC16 库函数 2. **计算简单**: 累加所有字节,取低16位 3. **性能更高**: 比 CRC16 计算更快 4. **足够可靠**: 对于局域网短距离通信,累加校验和已足够检测传输错误 ### 劣势 - 检错能力略低于 CRC16(但对于有线串口通信完全够用) ## 实现细节 ### STM32 端 (C语言) ```c /** * @brief 计算16位累加校验和 (Checksum_u16) */ static HIDO_UINT16 PythonLink_CalcChecksum(const HIDO_UINT8 *_pu8Data, HIDO_UINT32 _u32Len) { HIDO_UINT32 sum = 0; HIDO_UINT32 i; // 16位累加和 for (i = 0; i < _u32Len; i++) { sum += _pu8Data[i]; } // 返回低16位 return (HIDO_UINT16)(sum & 0xFFFF); } ``` ### Python 端 ```python # 计算并校验Checksum (16位累加和) checksum_calculated = sum(frame_for_checksum) & 0xFFFF if checksum_received != checksum_calculated: # 校验失败 pass ``` ## 修改的文件 ### STM32 固件 - `STM32H743/FML/PythonLink.c` - 移除 `#include "HIDO_ModbusCRC16.h"` - 将 `PythonLink_CalcCRC16()` 改为 `PythonLink_CalcChecksum()` - 实现 16位累加和算法 ### Python 解析器 - `python/gps_imu_receiver.py` - 移除 `from crcmod import predefined` - 移除 `self.crc16_func = predefined.mkCrcFun('modbus')` - 将 CRC16 校验改为 Checksum 校验 - 更新注释: `CRC` → `CHECKSUM` - `python/requirements.txt` - 移除 `crcmod>=1.7` 依赖 ## 协议格式(更新) ``` +--------+--------+------+--------+--------+------+----------+----------+ | Header | Header | Type | Length | Length | Data | Checksum | Checksum | | 0xAA | 0x55 | | Low | High | ... | Low | High | +--------+--------+------+--------+--------+------+----------+----------+ | Footer | Footer | | 0x0D | 0x0A | +--------+--------+ ``` **Checksum 计算**: - 范围: 从帧头 (0xAA) 到数据负载末尾 - 算法: 累加所有字节,取低16位 - 格式: 小端序 (Little Endian) ## 验证 编译 STM32 固件应该成功,无链接错误。 Python 端无需安装 `crcmod`,只需: ```bash pip install pyserial ``` ## 兼容性说明 此修改**不向后兼容**旧版协议(如果之前使用了 CRC16)。需要同时更新 STM32 固件和 Python 接收器。 ## 测试建议 1. 编译并烧录 STM32 固件 2. 运行 Python 接收器 3. 验证数据包能正常接收且 Checksum 校验通过 4. 故意修改数据包内容,验证 Checksum 能检测出错误 --- **修改日期**: 2025-11-13 **修改原因**: 修复 HIDO_CRC16Modbus 未定义链接错误 **影响范围**: PythonLink 模块和 Python 接收器