Parser问题:查找传感器parser.log中错误FCS的实现方法咨询
传感器报文解析与FCS校验实现方案
核心选型
直接使用Python脚本批量处理,无需额外安装依赖,处理效率远高于Excel手动计算,支持万级以上日志行数秒级完成解析校验。
具体实现步骤
1. 报文预处理
- 首先按帧分隔符
0x7E拆分parser.log内容,过滤掉空帧和长度不足的碎片帧 - 还原转义字符:按规则扫描所有帧的Data和FCS字段,将
7D 5E替换回0x7E,7D 5D替换回0x7D,注意从左到右顺序扫描避免重复转义 - 初步校验帧长度:未转义的完整标准帧长度为22字节(结构:
0x7E+0x40+0x51+17字节Data+1字节FCS+0x7E),长度不符直接标记为异常帧
2. FCS校验逻辑实现
- 提取待校验字段:去掉单帧首尾的
0x7E,再去掉最后1字节的FCS字段,剩余所有字节为校验计算范围 - 计算预期FCS值:
expected_fcs = 0xFF - (sum(待校验字节列表) % 0x100) - 比对预期值与报文中的实际FCS值,不一致则标记为FCS校验错误帧
3. 速度字段提取
合法校验通过的帧按以下规则提取速度:
- 提取Data字段:单帧去掉前3字节(
0x7E/0x40/0x51)后,取后续17字节即为Data字段 - 提取原始值:取Data字段第9位到第20位共12位数据,按小端(little endian)规则转换为十进制整数
- 计算实际速度:
实际速度 = 原始值 * 0.1
示例代码片段
def parse_sensor_log(log_path): result = [] with open(log_path, 'rb') as f: content = f.read() # 按0x7E拆分帧 frames = content.split(b'\x7e') for frame in frames: if not frame: continue # 还原转义 frame = frame.replace(b'\x7d\x5e', b'\x7e').replace(b'\x7d\x5d', b'\x7d') # 校验长度(去掉首尾0x7E后应为20字节:2字节报头+17字节Data+1字节FCS) if len(frame) != 20: result.append({"frame": frame.hex(), "status": "长度异常"}) continue # FCS校验 calc_bytes = frame[:-1] expected_fcs = 0xFF - (sum(calc_bytes) % 0x100) real_fcs = frame[-1] if expected_fcs != real_fcs: result.append({"frame": frame.hex(), "status": "FCS校验错误"}) continue # 提取速度:12位数据掩码可根据实际位偏移调整 data = calc_bytes[2:] raw_speed = int.from_bytes(data[1:3], byteorder='little') & 0x0FFF actual_speed = raw_speed * 0.1 result.append({"frame": frame.hex(), "status": "正常", "speed": actual_speed}) return result
结果输出
可以将解析结果直接导出为CSV格式,包含帧内容、校验状态、速度值等字段,方便后续统计分析。
内容的提问来源于stack exchange,提问作者moshiko netzer
相关产品推荐
相关产品推荐

