利用串列埠傳輸結構體資料

2021-10-04 03:12:00 字數 1441 閱讀 5808

寫在前面:

結構體是一種資料的歸類方式,相比陣列或變數更具有整體全面性,例如乙個陣列只可以放一些按照元素順序存放的單元變數,即 buffer = ,i 有多大,陣列內元素就有多少。那麼我們這時候如果我們用這個陣列來接收串列埠接收資訊,資訊的格式是: 資料頭 ->資料長度 ->資料區 ->資料校驗 ->資料尾

假設資料區為 《姓名-身高-體重-性別-年齡》

那麼我們用陣列接收時,提取資料的時候就需要計算出資料格式中每個單元所對應的位置,即陣列中第 i 個元素對應的內容;這樣顯然是很麻煩的,效率低下,這就相當於先織了乙個大網,捕捉到一網魚,還得過下稱,才能按照重量分類開來一樣

若是使用結構體來作資料傳輸,那麼只需要彼此約定俗成,注意一下事項就可以了

按照上面的,我們先來構建一下這個結構體

typedef struct

profile_typedef;

1、傳送

void send_function(void)

因為串列埠資料傳送是以 byte為單位,我們需要把結構體強制轉換一下

2、接收

profile_typedef message;

void recv_function( uint8_t *receivebuf )

你以為這樣就結束了嗎?錯的,你還要注意一些東西

1、大小端問題

假設你是用 stm32來通訊,那麼它的資料儲存方式是小端模式(這個看手冊,各款有著不同的資料儲存方式,具體以手冊為準),即資料的高位元組儲存在記憶體位址的高位元組,低位元組儲存在記憶體位址的低位元組,如果串列埠接收到的資料是低位元組在前,則拷貝來的資料就不用進行處理,如果接收的資料是高位元組在前則需要對拷貝來的資料進行高低位元組反轉,這個知識看開篇的 「位元組序部分」

2、資料對齊問題

結構體存放的資料是緊密的連在一起放在記憶體的,但是,各個硬體平台對儲存空間的處理上有很大的不同;一些平台對某些特定型別的資料只能從某些特定位址開始訪問,比如有些架構的 cpu在訪問乙個沒有進行對齊的變數的時候會發生錯誤,那麼在這種架構下程式設計必須保證位元組對齊;其他平台可能沒有這種情況,但是最常見的是如果不按照適合其平台要求對資料存放進行對齊,會在訪問效率上帶來損失

結構體的對齊以及資料大小計算可以看上面的 「c語言結構體大小及對齊問題」

一般來說,我們構建乙個結構體,它的對齊方式是按照編譯器的預設設定進行對齊的;然而,那麼我們是不是可以改變編譯器的這種預設對齊設定呢?這個是可以的,例如:

#pragma pack (2) /*指定按2位元組對齊*/

struct c

;#pragma pack () /*取消指定對齊,恢復預設對齊*/

#pragma pack (value)用於指定對齊值為 value值,當然,這是在 gcc編譯器上的指定對齊操作,不同的編譯器有著自己的操作指令

參考:

關於c 串列埠傳輸

串列埠傳輸都是經過serialport類來實現 在serialport中有三個事件,主要用到的是datareceived接受資訊事件與errorreceived接受錯誤資訊事件。在datareceived接收串列埠發來資訊 private void serialport1 datareceived ...

串列埠傳輸速率計算

起始位1bit,資料位8bit,停止位1bit,無校驗,無流控 波特率115200 bps 115200 位 秒 沒有校驗位時,起始位1bit 資料位8bit 停止位1bit 10bit 波特率115200 bps 115200 位 秒 11.25 kb 秒 11520 位元組 秒 串列埠通道可參考...

C 串列埠傳輸中文字元

傳送 encoding gb system.text.encoding.getencoding gb2312 byte bytes gb.getbytes 中文 serialport1.write bytes,0,bytes.length 接收 int ilen serialport1.bytest...