我已连接OBD2并使用atmel can控制器获取can数据(11bit 500kpbs CAN)。 我得到了数据。
现在,如何从这些数据中获取模式和PID? 例如,我的数据如下所示:
15164A8A-FF088B52 -- Data: 00,00,00,86,9C,FE,9C,FE,
我可以在数据字段上看到RPM更改,点火开/关等.... 我不想使用ELM芯片。我需要直接处理原始数据。
答案 0 :(得分:2)
提示:我的所有号码都是HEX。
OBD2协议以字节(8位)发送响应。响应细分为标题(或称为ID)和数据。
ID是ECU的地址,数据是"响应数据"来自ECU,它总是8个字节(CAN总线协议?!)。
8个字节的数据将被分为PCI(可以是一个或两个字节)和值。 PCI将显示您的帧类型(单个,第一个,连续或流控制帧)以及传入的字节数。
为了让我更容易,我只为单帧做一个例子:
您可以向主ECU发送OBD请求,如下所示:
7DF 02 01 0C 00 00 00 00 00
7DF
是诊断测试仪设备的ECU地址。
02
是发送数据字节的数量
01
是模式(你可能会感兴趣!)01是当前数据,02是冻结帧等。
0C
是rpm PID。
ECU的响应类似于(单帧):
7E8 04 41 0C 12 13 00 00 00
7E8
是响应的ECU。
04
个传入数据字节数。
41
数据响应01
PID
0C
对此PID的响应
12 13
是响应0C
的两个字节。请记住,您必须使用OBD II ISO协议解码这两个字节。你也可以在维基百科上找到一些转换率。
其他字节无用。
要简化:你必须解析ECU的每个响应,并尝试将有用的字节转换为可读的十进制值。这取决于您使用的编程语言。在C / C ++中,我认为最佳实践是unsigned char
,编译器保证为8位,而在JAVA中,它可以是Byte
。此外,尝试使用按位运算符使您的生活更轻松。
通过更多问题,请不要犹豫。