這裏的數據使用的是標準的can設備產生的can信號(擴展幀發送數據ID=0x11121181 Data=0x06 0x08)
信號的波形如圖1所示,這裏示波器的探頭接的是CAN_H,探頭的夾子接的是CAN_L:
圖1 示波器顯示波形
首先根據本博客中前面寫的一篇如何測量can總線波特率獲取總線的波特率,然後依據波特率和上面的波形讀出具體的數據
從上面的波形中讀取到的數據是
10111011101100011110111001111101011111001111101001111100111101111011011101
根據標準can2.0b協議可以講該字符串解析出來,標準的擴展協議如圖2所示
圖2 can擴展消息格式
然後將數據根據格式劃分成各個有意義的字段,如圖3所示,這裏我自己將高電平編碼爲1,低電平編碼爲0。但是在can協議中,他將高電平定義爲顯性位,邏輯上定義爲0,將低電平定義爲隱形位,邏輯上定義爲1,我們前面先不管這個。
圖3 數據分割
在can的協議中當連續出現5個高電平時就需要插入一個低電平,所以在解析的過程中需要將這些插入的數據刪除,就是圖3中用紅線刪除的那些數據。
在刪除這些數據之後根據圖2的格式可以將各個字段分割出來
解析信息:
29位ID:0 1110 1110 1101 1110 1110 0111 1110,從右到左每4位一個字段,這裏需要將其在轉換回can協議定義的邏輯電平的形式---即將0變爲1,將1變爲0,這樣便符合我們日常的編碼習慣。解析出來的ID=0x11121181,與我們發送的數據是相符合的。
DLC:1101 轉換成十進制爲2 表示這一幀中有兩個數據,接下來的16個字節便表示2個數據
D1:11111001 = 0x06
D2:11110111 = 0x08
這樣便解析出了我們需要的數據,這是和我發送的數據一致的。
這裏需要注意的有兩點:
1、在can的協議中當連續出現5個高電平時就需要插入一個低電平;
2、在can協議中將CAN_H和CAN_L的差值爲高電平時定義爲顯性,邏輯上表示爲0,爲低電平時定義爲隱形,邏輯上表示爲1。這在解碼的過程中需要注意。