結(jié)構(gòu)體、聯(lián)合體是C語(yǔ)言中的構(gòu)造類型,結(jié)構(gòu)體我們平時(shí)應(yīng)該都用得很多。但是,對(duì)于聯(lián)合體,一些初學(xué)的朋友可能用得并不多,甚至感到陌生。我們先來(lái)簡(jiǎn)單看一下聯(lián)合體:
union 聯(lián)合名
{
成員表
};
成員表中含有若干成員,成員的一般形式為:類型說(shuō)明符 成員名
。其占用的字節(jié)數(shù)與成員中最大數(shù)據(jù)類型占用的字節(jié)數(shù)。
下面用代碼進(jìn)行理解:
enum DATA_PKG_TYPE
{
DATA_PKG1 = 1,
DATA_PKG2,
DATA_PKG3
};
struct data_pkg1
{
// ...
};
struct data_pkg2
{
// ...
};
struct data_pkg3
{
// ...
};
struct data_pkg
{
enum DATA_PKG_TYPE data_pkg_type;
union
{
struct data_pkg1 data_pkg1_info;
struct data_pkg2 data_pkg2_info;
struct data_pkg3 data_pkg3_info;
}data_pkg_info;
};
把struct data_pkg1、struct data_pkg2、struct data_pkg3三個(gè)結(jié)構(gòu)體放到了struct data_pkg這個(gè)結(jié)構(gòu)體里進(jìn)行管理,把data_pkg_type與union里的三個(gè)結(jié)構(gòu)體建立一一對(duì)應(yīng)關(guān)系,我們需要用哪一結(jié)構(gòu)體數(shù)據(jù)就通過(guò)data_pkg_type來(lái)進(jìn)行選中。
在進(jìn)行數(shù)據(jù)組包的時(shí)候,先給data_pkg_type進(jìn)行賦值,確定數(shù)據(jù)包的類型,再給對(duì)應(yīng)的union里的結(jié)構(gòu)體進(jìn)行賦值;在進(jìn)行數(shù)據(jù)解析的時(shí)候,通過(guò)data_pkg_type來(lái)選擇解析哪一組數(shù)據(jù)。
結(jié)構(gòu)體部分:
#define BUF_SIZE 16
union protocol_data
{
uint8_t data_buffer[BUF_SIZE];
struct
{
uint8_t data1;
uint8_t data2;
uint8_t data3;
uint8_t data4;
// ...
}data_info;
};
struct里面的內(nèi)容可以設(shè)計(jì)得很簡(jiǎn)單,比如全是有用的數(shù)據(jù),或是設(shè)計(jì)得很復(fù)雜,包含一些協(xié)議頭尾、包長(zhǎng)、有效數(shù)據(jù)、校驗(yàn)等內(nèi)容。
但無(wú)論如何,我們組包發(fā)送的過(guò)程是填充結(jié)構(gòu)體->發(fā)送data_buffer
;反之接收數(shù)據(jù)解析的過(guò)程就是接收數(shù)據(jù)存于data_buffer->使用結(jié)構(gòu)體數(shù)據(jù)
。
審核編輯:湯梓紅
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3002瀏覽量
73884 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7598瀏覽量
136197 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
130瀏覽量
10833
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論