OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9367|回复: 11

结构体和联合体在通信协议解析的应用

[复制链接]

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2012-6-27
在线时间
14 小时
发表于 2012-6-27 14:09:10 | 显示全部楼层 |阅读模式

在串口通信中,我们往往会解析很多协议,而且在协议中会出现不同数据类型的协议;当然我们也可以把协议都定义成某一种数据格式,但是那样会出现协议的复杂度,但是不那样处理的话,程序在处理协议时会变得很难。

为了解决这个问题,本人就应用了结构体和联合体的方式来解决了,反正个人认为自己的方法很实用;

具体方法是:

1、将不同类型的协议分成不同的结构体

struct ChaX_Data     //检测数据协议

{

        float                     P0;//功率

       float                     DN;//电能

       u16                Ia;//A相电流

       u16                      Ic;//C相电流

       u16                      Ua;//AB相电压

       u16                      Ub;//BC相电压

       u16                      Uc;//AC相电压

};

struct Time_bit       //时间设置协议

{

       u8 year;  //

       u8 month; //

        u8 date;  //

        u8 hour;  //

        u8 min;   //

        u8 sec;   //

};

2、将不同的协议结构体组合在同一个联合体内

union

{

       struct ChaX_Data ChaX;

       struct Time_bit      Time;

       u8                 Buff[30];

} UART_RX;

3、串口收到数据程序处理

u8 RX_Num = 0;

void Uart_RX_SYS()

{

  if(USART_GetFlagStatus(UART4, USART_FLAG_RXNE) != RESET)

  {

UART_RX . Buff [RX_Num]= USART_ReceiveData(UART4);

RX_Num ++;

}

}

当然我这只是一个简单的比方,具体程序还得更加复杂。

4、应用方式:直接在程序中应用

如果是检测数据协议分析 我们可以这样应用

float Flaot_Power;

u16 U16_Ia;

Flaot_Power = UART_RX . ChaX . P0;

U16_Ia = UART_RX . ChaX . Ia;

 

如果时间设置协议 我们可以这样应用

U8 Set_ min;

U8 Set_sec;

Set_ min = UART_RX . Time. min;

 

 

由于本人从小语文就不是很好,所以表达的不是很清楚 希望各位多多谅解!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2012-6-27 15:17:54 | 显示全部楼层
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-6-27 15:18:19 | 显示全部楼层
是可以这么用.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2012-6-27
在线时间
14 小时
 楼主| 发表于 2012-6-27 17:03:56 | 显示全部楼层
如果发送和接收两个CPU的程序都是自己编写的话,用这个方式来制作通信协议会很简单,而且以后产品功能升级(协议增加)的话,用这个方式最好不过了,无非就在共用体里面在增加一条新的结构体。如果想弄的在复杂点的话,在结构体里面嵌套公用体,可以多层嵌套
回复 支持 反对

使用道具 举报

53

主题

113

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
433
金钱
433
注册时间
2013-4-10
在线时间
83 小时
发表于 2013-4-18 12:00:04 | 显示全部楼层
回复【楼主位】fekua:
---------------------------------能再讲的详细点吗?
不是很明白,正在做相关的项目,头都大了,如果有这方面的资料的话,就给我发下吧,谢谢!
打铁还需自身硬@ing
回复 支持 反对

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-6-1 09:50:02 | 显示全部楼层
回复【4楼】fekua:
---------------------------------
这样用的方式确实好用,但是在通信协议中你不需要判断吗?收到的到底是电压、电流?    还是小时、分钟?
合肥-文盲
回复 支持 反对

使用道具 举报

6

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2014-7-18
在线时间
4 小时
发表于 2015-6-1 18:26:59 | 显示全部楼层
回复【6楼】合肥-文盲:
---------------------------------
收进来以后在判断
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-7-29 21:37:49 | 显示全部楼层
厉害,学习了
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

11

主题

179

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1103
金钱
1103
注册时间
2016-7-19
在线时间
168 小时
发表于 2016-12-9 17:27:51 | 显示全部楼层
学习了!
回复 支持 反对

使用道具 举报

2

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
383
金钱
383
注册时间
2015-4-15
在线时间
73 小时
发表于 2016-12-9 19:09:13 | 显示全部楼层
这种写法是比较常用的,注意大小端格式
回复 支持 反对

使用道具 举报

32

主题

300

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2012-3-30
在线时间
321 小时
发表于 2016-12-9 19:20:15 | 显示全部楼层
大家都说好
回复 支持 反对

使用道具 举报

4

主题

133

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3862
金钱
3862
注册时间
2016-6-11
在线时间
710 小时
发表于 2016-12-9 20:39:37 | 显示全部楼层
已在具体运用中这样使用。非常好,方便
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 11:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表