我已經連接OBD2並使用atmel can控制器獲取can數據(11bit 500kpbs CAN)。我得到的數據是 。如何從原始OBD2標識符11或29位獲取「模式和PID」?
現在,我該如何從這些數據中獲取模式和PID? 例如,我的數據是這樣的:
15164A8A-FF088B52 -- Data: 00,00,00,86,9C,FE,9C,FE,
我可以看到開/關等RPM改變,點火......在數據字段。 我不想使用ELM芯片。我需要直接處理原始數據。
我已經連接OBD2並使用atmel can控制器獲取can數據(11bit 500kpbs CAN)。我得到的數據是 。如何從原始OBD2標識符11或29位獲取「模式和PID」?
現在,我該如何從這些數據中獲取模式和PID? 例如,我的數據是這樣的:
15164A8A-FF088B52 -- Data: 00,00,00,86,9C,FE,9C,FE,
我可以看到開/關等RPM改變,點火......在數據字段。 我不想使用ELM芯片。我需要直接處理原始數據。
提示:我所有的號碼都是十六進制。
OBD2協議以字節(8位)發送響應。響應細分爲標題(或稱爲ID)和數據。
ID是ECU的地址,數據是來自ECU的「響應數據」,並且始終爲8個字節(在CAN總線協議?!中)。
8字節的數據將被分成PCI(可以是一個或兩個字節)和值。 PCI會告訴你什麼是你的幀類型(單個,第一個,連續或流量控制幀)以及傳入的字節數。
,以方便我做只爲單個幀的例子:
您可能會發送一個OBD請求,主ECU這樣的:
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協議解碼這兩個字節。您還可以在Wikipedia上找到一些轉化率。
其他字節無用。
簡而言之:您必須解析來自ECU的每個響應,並嘗試將有用字節轉換爲可讀的十進制值。這取決於您正在使用哪種編程語言。在C/C++中,我認爲最好的做法是unsigned char
,它由編譯器保證爲8位,而在JAVA中,它可以是Byte
。此外,嘗試使用按位運算符來讓您的生活更輕鬆一些。
通過更多的問題不要猶豫,問。
謝謝。測試完成後我會回到你身邊。 – Eugene