CAN通信中的數(shù)據(jù)轉(zhuǎn)換

CAN通信的時候,每一幀的大小是有固定限制的沪铭,所以為了將盡可能多的數(shù)據(jù)通過一幀frame傳輸出去壮池,都會將數(shù)據(jù)盡量壓縮到一個frame里面。比如受信的時候杀怠,有的數(shù)據(jù)在代碼里面是用char存儲的椰憋,但是內(nèi)容可能僅僅是0和1。這樣的數(shù)據(jù)在往frame里面送的時候可能僅僅1個bit就足夠了赔退。針對這樣的轉(zhuǎn)換橙依,可以使用下面函數(shù)來實現(xiàn)。這個函數(shù)的概要就是從Buffer所表示的某個frame里面硕旗,從StartIndex的BitPosition開始的長度為size的數(shù)據(jù)給截取出來賦值給某個變量窗骑。?

uint32 ExtractData(uint8 Buffer[], uint8 StartIndex, uint8 BitPosition, uint8 Size){ uint8 TempData; uint32 RstData; uint8 TempSize; RstData = 0x00; while ((BitPosition + 1) < Size) { /* Calculate size in 1 byte */ TempSize = BitPosition + 1; /* Extract Data in 1 byte */ TempData = ExtractByteData(Buffer[StartIndex], BitPosition, TempSize); /* Update Parameter */ Size = Size - TempSize; RstData = RstData + (TempData << Size); BitPosition = 7; StartIndex++; } /* Extract Data */ RstData = RstData + ExtractByteData(Buffer[StartIndex], BitPosition, Size); return?(RstData);}

其中ExtractByteData函數(shù)的處理如下uint8, ExtractByteData(uint8 Data, uint8 BitPosition, uint8 Size){ uint8 Value; uint8 Mask; uint8 Shift; if ((0 < Size) && (Size <= 8)) { Shift = BitPosition - (Size - 1); Value = Data >> Shift; Mask = BIT_MASK(Size); Value = Value & Mask; } else if (Size == 0) { Value = 0x00; } else { Value = Data; } return (Value);}BIT_MASK的定義為 #define BIT_MASK(Size) ((1u << (Size)) - 1)下面是將數(shù)據(jù)壓縮到一個frame里面的操作。這個例子里面數(shù)據(jù)a是一個uint32的數(shù)據(jù)漆枚,想將它里面的值放到frame的4到6里面慧域,4和5占8位,6占2位浪读。每個byte里面都是從第7位開頭昔榴。DataBuf[4] |= (uint8)(((a / 0x400) & BIT_MASK(8)) << BIT_SHIFT(7,8));DataBuf[5] |= (uint8)(((a / 0x4) & BIT_MASK(8)) << BIT_SHIFT(7,8));DataBuf[6] |= (uint8)(((a) & BIT_MASK(2)) << BIT_SHIFT(7,2));BIT_SHIFT的定義是 BIT_SHIFT(StartPosition, Size) (uint8)((StartPosition) - ((Size) - 1))


//將val的值放到array的pos位置開始的len長度的空間

SetBits(uint8 array[], uint32 pos, uint32 len, uint32 val)

{

? ? uint32 byte_pos = pos / 8;

? ? /* top zone */

? ? if ((pos % 8) > 0)

? ? {

? ? ? ? uint32 rem_bits = 8 - (pos % 8);

? ? ? ? uint32 tlen = ((len < rem_bits) ? len : rem_bits);

? ? ? ? uint32 off = rem_bits - tlen;

? ? ? ? len -= tlen;

? ? ? ? array[byte_pos] &= (uint8)~((uint32)BIT_MASK(tlen) << off);

? ? ? ? array[byte_pos] |= (uint8)((val >> len) << off);

? ? ? ? byte_pos += 1;

? ? }

? ? /* byte copy zone */

? ? while (len >= 8)

? ? {

? ? ? ? len -= 8;

? ? ? ? array[byte_pos] = (uint8)(val >> len);

? ? ? ? byte_pos += 1;

? ? }

? ? /* last zone */

? ? if (len > 0)

? ? {

? ? ? ? uint32 off = 8 - len;

? ? ? ? array[byte_pos] &= (uint8)(~(BIT_MASK(len) << off));

? ? ? ? array[byte_pos] |= (uint8)(((uint32)val & BIT_MASK(len)) << off);

? ? }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辛藻,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子互订,更是在濱河造成了極大的恐慌吱肌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仰禽,死亡現(xiàn)場離奇詭異氮墨,居然都是意外死亡,警方通過查閱死者的電腦和手機吐葵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門规揪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人温峭,你說我怎么就攤上這事猛铅。” “怎么了凤藏?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵奸忽,是天一觀的道長。 經(jīng)常有香客問我揖庄,道長栗菜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任蹄梢,我火速辦了婚禮疙筹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘禁炒。我一直安慰自己腌歉,他們只是感情好,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布齐苛。 她就那樣靜靜地躺著翘盖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凹蜂。 梳的紋絲不亂的頭發(fā)上馍驯,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機與錄音玛痊,去河邊找鬼汰瘫。 笑死,一個胖子當著我的面吹牛擂煞,可吹牛的內(nèi)容都是我干的混弥。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蝗拿!你這毒婦竟也來了晾捏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤哀托,失蹤者是張志新(化名)和其女友劉穎惦辛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仓手,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡胖齐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了嗽冒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呀伙。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖添坊,靈堂內(nèi)的尸體忽然破棺而出剿另,到底是詐尸還是另有隱情,我是刑警寧澤帅腌,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布驰弄,位于F島的核電站麻汰,受9級特大地震影響速客,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜五鲫,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一溺职、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧位喂,春花似錦浪耘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至规婆,卻和暖如春澜躺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抒蚜。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工掘鄙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嗡髓。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓操漠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饿这。 傳聞我的和親對象是個殘疾皇子浊伙,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容