链接错误: Undefined symbol HIDO_CRC16Modbus
原因: 项目中 HIDO_ModbusCRC16.h 声明了 HIDO_ModbusCRC16() 函数,但该函数没有实现(缺少 .c 源文件)。
将校验算法从 CRC16-MODBUS 改为 16位累加校验和 (Checksum_u16)。
/**
* @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);
}
# 计算并校验Checksum (16位累加和)
checksum_calculated = sum(frame_for_checksum) & 0xFFFF
if checksum_received != checksum_calculated:
# 校验失败
pass
STM32H743/FML/PythonLink.c#include "HIDO_ModbusCRC16.h"PythonLink_CalcCRC16() 改为 PythonLink_CalcChecksum()python/gps_imu_receiver.pyfrom crcmod import predefinedself.crc16_func = predefined.mkCrcFun('modbus')CRC → CHECKSUMpython/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 接收器。
修改日期: 2025-11-13
修改原因: 修复 HIDO_CRC16Modbus 未定义链接错误
影响范围: PythonLink 模块和 Python 接收器