2016-11-27 54 views
0

我已經連接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芯片。我需要直接處理原始數據。

回答

2

提示:我所有的號碼都是十六進制。

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。此外,嘗試使用按位運算符來讓您的生活更輕鬆一些。

通過更多的問題不要猶豫,問。

+0

謝謝。測試完成後我會回到你身邊。 – Eugene

相關問題