CAN流控帧与首帧

38 次阅读

本文最后更新于 2026年5月19日。

关键发现:

  • 第 9 帧: ID=0x7f9, PCI=13, DATA=13 07 62 FA 13 FF FF FF
    问题所在: 首帧的 PCI 是 0x13 而不是 0x10 !这是 ISO-TP 协议的首帧格式 :

  • 13 = 首帧标识,其中高 4 位 1 表示首帧,低 4 位 3 表示数据长度信息的一部分

  • 07 = 实际数据长度(767 字节,计算公式:(0x13 & 0x0F) << 8 | 0x07 = 0x307 = 775 字节)

修复代码,正确识别 ISO-TP 首帧,使用 正确的 ISO-TP 协议解析 :

修复内容:

1. ISO-TP 首帧识别

# 原来:只识别 0x10
if data[0] == 0x10:

# 现在:识别所有 0x10-0x1F 范围
if (data[0] & 0xF0) == 0x10:

2. ISO-TP 连续帧识别

# 原来:只识别 0x21-0x2F
elif 0x21 <= data[0] <= 0x2F:

# 现在:识别所有 0x20-0x2F 范围
elif (data[0] & 0xF0) == 0x20:

3. 帧序号说明

  • 首帧: 0x10-0x1F (高 4 位为 1)
  • 连续帧: 0x20-0x2F (高 4 位为 2)
  • 流控帧: 0x30-0x3F (高 4 位为 3)
    现在运行脚本应该能正确解析所有数据帧了,