C語言的結構體和共用體在微控制器中的妙用

2021-10-09 08:56:02 字數 1490 閱讀 4035

c語言的結構體和共用體,往往在微控制器應用開發中被忽視。如果能夠用起來,不僅能夠極大的提高微控制器的執行效率,還可能解決一些看起來無法解決的問題。

現在,給大家舉乙個例子:微控制器串列埠需要接收並處理大量資料的情況。

示例:微控制器甲要與某個裝置乙通訊,它們採用串列埠連線,裝置乙會給微控制器甲傳送串列埠資料,資料一共有46個位元組,其中前8個位元組表示命令,後8個位元組表示裝置資訊,中間30個位元組表示有效資料。

普通的程式**,會進行如下變數定義:

unsigned

char rec_buf[46]

;// 定義接收快取

unsigned

char command[8]

;// 定義命令變數

unsigned

char valid_data[30]

;// 定義有效資料變數

unsigned

char device_info[8]

;// 定義器件資訊變數

在串列埠中斷函式中,使用rec_buf接收串列埠資料。此處省略接收**,自行腦補。

接收完畢後,再使用如下**把對應的變數取出來。

//取出命令

for(i=

0;i<

8;i++

)//取出有效資料

for(i=

8;i<

38;i++

)//取出器件資訊

for(i=

38;i<

46;i++

)

取出來之後,就可以在程式中使用了,比如,判斷接收到的是什麼命令,如下**所示:

if

(command[0]

==0x88

)// 如果是修改引數命令..

.}

好!上面是普通的用法,接下來,我們使用結構體和共用體!

union

cominfo;

}d_buf;

上面**中,我們使用了共用體和結構體的方法定義了串列埠接收快取和串列埠命令、有效資料和器件資訊變數。

當我們在串列埠中斷中接收完資料後。就可以直接使用這些變數了。例如:

if

(d_buf.cominfo.command[0]

==0x88

)// 如果是修改引數命令..

.}

下面,我解釋一下**。

共用體的特點:內部的變數使用同乙個首位址。在我們定義的共用體裡面,有兩個變數,乙個是rec_buf,乙個是cominfo,所以,它倆的記憶體首位址是相同的。

結構體的特點:內部的變數位址自增。在我們定義的結構體cominfo中,command變數、valid_data變數、device_info變數使用同一片記憶體空間,位址連續。

基於以上共用體和結構體的特點,當我們接收完rec_buf以後,其實,資料就已經在結構體中的這3個變數中了,直接用就可以,省去了前面示例中「取出來」的環節。

c語言複習 結構體和共用體

注 本文是對蘇小紅版c語言程式設計第12章的筆記 結構體的定義 結構體的宣告 主要目的 用已有的資料型別定義乙個新的資料型別 struct 結構體名 結構體名成為結構體標籤 e.g.struct student 注意,結構體模板只是宣告了一種資料型別,並未宣告結構體型別的變數 結構體變數的定義 方法...

c語言的結構體 共用體 列舉

struct s var struct s var1 結構體本身的開頭和結尾位址都是4位元組的整數倍 var2 結構體本身的開頭和結尾位址都是4位元組的整數倍 var3 結構體本身的開頭和結尾位址都是4位元組的整數倍 由此可見,元素的安放順序非常講究 offsetof type,member typ...

重拾C語言 結構體和共用體

結構體 不同型別變數的集合 陣列 相同型別變數的集合 struct長度 最後乙個成員大小 最後乙個成員偏移量 填充值 結構體中的成員的偏移量需是自身長度的整數倍 不夠就填充 結構體總長度必須是佔記憶體最大的成員的長度的整數倍。三種方式定義結構體 1.struct weapon struct weap...