结构体、联合体是C语言中的构造类型,结构体我们平时应该都用得很多。但是,对于联合体,一些初学的朋友可能用得并不多,甚至感到陌生。我们先来简单看一下联合体:
union 联合名
{
成员表
};
成员表中含有若干成员,成员的一般形式为:类型说明符 成员名
。其占用的字节数与成员中最大数据类型占用的字节数。
下面用代码进行理解:
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三个结构体放到了struct data_pkg这个结构体里进行管理,把data_pkg_type与union里的三个结构体建立一一对应关系,我们需要用哪一结构体数据就通过data_pkg_type来进行选中。
在进行数据组包的时候,先给data_pkg_type进行赋值,确定数据包的类型,再给对应的union里的结构体进行赋值;在进行数据解析的时候,通过data_pkg_type来选择解析哪一组数据。
结构体部分:
#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里面的内容可以设计得很简单,比如全是有用的数据,或是设计得很复杂,包含一些协议头尾、包长、有效数据、校验等内容。
但无论如何,我们组包发送的过程是填充结构体->发送data_buffer
;反之接收数据解析的过程就是接收数据存于data_buffer->使用结构体数据
。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !