不明白为什么 UDS 长度对我来说似乎是错误的



我正在学习UDS,在这个过程中我遇到了从汽车上记录的数据框

Tester,02 10 01 
Car.  ,10 18 50 01 AA AA AA AA  
Tester,30 00 00 .. FLOW CONTROL  
Car.  ,21 AA AA AA AA AA AA AA  
Car.  ,22 AA AA AA AA AA AA AA  
Car.  ,23 AA AA AA AA 00 00 00  

我不明白的是: 测试器帧中的长度为 2,后跟两个字节,这是正确的。请注意,函数和子函数按长度计算。 但是在测试器中,长度是 18,但是当我计算字节数(在我的示例中为 AA(时,它们是 22 个字节,不包括正响应和子函数,如果我们包含它们,它将变为 24。 那么ISO-TP中的长度是否仅指以下帧而不是第一帧?因为如果我们不接收具有位置消息的第一帧,那么 AA 字节的长度为 18。

另外,有人可以指导我找到一个实现UDS的好库(最好是现在使用Python,因为我仍在学习过程中(,因为我只是在做所有硬编码的事情,我不喜欢我最终得到的混乱。

消息中的长度是正确的 - 它是根据整个有效负载计算的:包括 SID、子函数等,但不包括:

  • 长度本身
  • 控制信息(即连续帧计数器(
  • 末尾的填充(即0x00(

在单帧中,长度仅占用 1 个字节,而在第一帧中,长度本身需要 12 位(因此占用 2 个字节,包括控制信息0x1,以将帧类型标记为第一帧(。

Car.  ,10 18 50 01 AA AA AA AA  
Tester,30 00 00 .. FLOW CONTROL  
Car.  ,21 AA AA AA AA AA AA AA  
Car.  ,22 AA AA AA AA AA AA AA  
Car.  ,23 AA AA AA AA 00 00 00  

在您的示例中,第一帧的长度为 0x18 - 第一帧的前 2 个字节(0x10、0x18(不计入长度。因此,如果您计算以 0x50 开头并排除连续帧计数器(0x21、0x22、0x23 等(的字节数:

0x50, 0x01, 0xAA, 0xAA, 0xAA, 0xAA,
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA 
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA 
0xAA, 0xAA, 0xAA, 0xAA

正好有 24 个字节(十六进制的 0x18 个字节(。

在Python中,您可以使用udsoncan库来获取基于UDS服务的抽象,或者使用python-can-isotp为您处理传输层。

最新更新