1. 程式人生 > >CAN匯流排資料演算法

CAN匯流排資料演算法

    之前學過一些C語言和彙編,瞭解過二進位制機器碼,未進行過多的應用。去年做了一年的開發,有些資料演算法得用到16進位制轉化為二進位制或轉化成10進位制。根據自己的經驗總結下演算法。

  1.   二進位制比較簡單的記憶為8,4,2,1。8=2^3;4=2^2;2=2^0;1=2^0。
  2.  16進位制數,一個位元組(byte)為8位。例如:0x30=00110000。由上面的演算法,分開看二進位制資料高四位結果M=0+0+2^1+2^0=3;後四位為L=0*2^3+0*2^2+0*2^1+0*2^0=0。所以可以得到N=0011 0000=0x30
  3. 16進位制數,轉化成10進位制數。如上例中的0x30轉化為10進位制K=3*16^1=48;0xFF=15*16^1+15*16^0=255。

       在汽車軟體開發過程中,演算法也是很必要的。現在大多數車輛的通訊協議為CANBUS匯流排協議,在CAN匯流排協議演算法進行編譯的時候採用二進位制,但是在解析的過程中,比較直觀的還是10進位制或者是16進位制演算法。

     之前接觸過最多的是十六進位制演算法應用在“各種狀態”,10進位制演算法應用在“動力系統”方面。之後又看到過一些關於CAN匯流排演算法參照位元順序。在下面一一敘述自己的看法。

  • 位元順序。(通常情況下會先有範圍值)。例如:節氣門的位置用8位元資料來表示,可以有256種變化,因此從0°到102°的節氣門位置可以以0.4°為間隔進行傳輸。                                                                                                                                                    
位元順序 節氣門位置
0000 0000 節氣門開啟角0.0°
0000 0001 節氣門開啟角0.4°
0000 0010 節氣門開啟角0.8°
.....
1111 1111  節氣門開啟角102.0°
  • 十進位制。演算法為10進位制,如何轉化為10進位制進行計算呢。一般規律是:高8位*256+低八位*1。還有些資料會調換位置。例如方向盤扭矩。演算法為E = N * 0.01 。方向盤扭矩的為16位元資料,資料為16進位制00 01 00 00 00 00 00 00。控制位為紅色字型0x00 01,其中0x00為高8位,0x01為低8位。0x00轉化為10進製為0;0x01轉化為10進製為1。

名稱

演算法
方向盤扭矩 (0*256+1*1)*0.01
  • 十六進位制。演算法為16進位制通常情況下為各種狀態或者使能。通常對一個數進行邏輯運算,說白了也是二進位制運算。例如:0xC4&0x20=0010 0000 有效位為1 開,,若有效位為0,即關。

      在CAN匯流排資料的運算過程中,都是機器碼二進位制轉換而來,有時候寫成這種格式比較簡單,淺顯易懂。