编辑 | blame | 历史 | 原始文档

校验算法修改说明

修改原因

链接错误: 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语言)

/**
 * @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 端

# 计算并校验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 校验
  • 更新注释: CRCCHECKSUM
  • 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 接收器