OpenEdv-开源电子网

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

串口协议帧设计问题

[复制链接]

79

主题

127

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
465
金钱
465
注册时间
2013-2-19
在线时间
1 小时
发表于 2013-9-29 14:13:59 | 显示全部楼层 |阅读模式
我弄一个串口数据帧格式:
0x55 0xaa 数据字节数  XXXXXXXXXXX 校验 OD
数据字节数:0x12 0x34 表示 有1234个字节,校验是所有数据的异或。

我在STM32的串口程序中写的程序,始终不能收到第二帧。请大家帮忙看看那里出问题了:
下面的num是全局静态变量
void USART2_IRQHandler(void)
{
   
if(USART2->SR&(1<<5))//接收到数据 状态寄存器的第五位表示读数据寄存器非空,当有数据时改为置1
//当读数据后该位自动被清零。
{  //经过测试在发送数据时程序能到达这里 
USART_RX_BUF[num] = USART2->DR;
num++;     
}
if((USART_RX_BUF[0] == 0x55) && (USART_RX_BUF[1] == 0xaa))
{
begin = 1;  //经过验证收到报文头
}  



void RcvDatDeal(void)
{
u8 i = 0;
u8 check = 0;
//这个数据个数仅仅表示真实数据的个数,不包括报文头、数据个数位、校验位、结束位。
datNum = ((USART_RX_BUF[2]&0xf0) >> 4) * 1000+(USART_RX_BUF[2]&0x0f) * 100 +((USART_RX_BUF[3]&0xf0) >> 4)*10 + USART_RX_BUF[3] & 0x0f;
for(i = 2; i < num-2;i++)//对接收到的数据个数和数据进行异或校验
{
check ^= USART_RX_BUF;//经过测试发现check确实正确了
}

//下面表示接收数据个数正确,接收到报文尾,校验位正确
if((datNum == (num-6)) && (USART_RX_BUF[num-1] == 0x0D) && (check == USART_RX_BUF[num-2]))
{
num = 0;//准备接收下一帧
rcvRightFlg = 1;//接收1帧正确。
}
}

在主函数中的:
先检测begin当他为1时,调用 RcvDatDeal(void) 
当 rcvRightFlg = 1 时,我吧缓存中USART_RX_BUF【】中的数据读出来,写到eeprom中,我的缓存区的大小就是1帧的大小。
我在串口助手中,单独发送55 AA 00 03 04 05 06 04 0D 和55 AA 00 03 00 00 00 03 0D时能收到
但是当我把他们放在一起发送时,就只能收到前面的数据,收到后面的数据是错误的。
我在程序中是按帧来接收数据的,不知道为什么?
另外,在实际应用需求是通过上位机吧数据按照帧格式打包,然后一帧一帧持续发送的,这种情况该怎样做了?
谢谢大家。













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

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2013-9-30 08:57:51 | 显示全部楼层
同意LS们的意见,没有帧结束判断,何来判断收到1帧而处理?
于20150522停用该账号:http://www.microstar.club
回复 支持 0 反对 1

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-9-29 14:28:48 | 显示全部楼层
你数据是怎么一起发送法,你发送的数据有没有超过你接收缓冲区的大小
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

79

主题

127

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
465
金钱
465
注册时间
2013-2-19
在线时间
1 小时
 楼主| 发表于 2013-9-29 16:55:50 | 显示全部楼层
回复【2楼】Badu_Space:

你数据是怎么一起发送法,你发送的数据有没有超过你接收缓冲区的大小

---------------------------------
通过串口助手,把数据55 AA 00 03 04 05 06 04 0D放在发送栏,点发送。这种可以的
第二种方式:55 AA 00 03 04 05 06 04 0D和55 AA 00 03 00 00 00 03 0D一起放在发送栏,再点发送,出错了。我的缓存区只能存一个帧的。但是我的数据接收是设置了报文头,报文尾的,解析的时候当收到完整一帧后,我就读出去了,吧它写到eeprom中了,第二帧可以覆盖缓存区中的第一帧数据啊?不知为什么还是出错,请帮忙。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-30 04:35:30 | 显示全部楼层
因为你发送的时间间隔太短了,导致第一帧还没处理好,第二帧就来了,从而,导致数据丢失。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-9-30 08:41:54 | 显示全部楼层
根据原子哥的方法,接收完第一帧数据时,延时一下再接收第二帧
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

79

主题

127

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
465
金钱
465
注册时间
2013-2-19
在线时间
1 小时
 楼主| 发表于 2013-9-30 11:30:53 | 显示全部楼层
回复【6楼】styleno1:

同意LS们的意见,没有帧结束判断,何来判断收到1帧而处理?

---------------------------------
我有帧结束判断啊,
/下面表示接收数据个数正确,接收到报文尾,校验位正确
if((datNum == (num-6)) && (USART_RX_BUF[num-1] == 0x0D) && (check == USART_RX_BUF[num-2]))
{
num = 0;//准备接收下一帧
rcvRightFlg = 1;//接收1帧正确。
}
当rcvRightFlg = 1就表示收到一帧了
回复 支持 反对

使用道具 举报

79

主题

127

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
465
金钱
465
注册时间
2013-2-19
在线时间
1 小时
 楼主| 发表于 2013-9-30 11:36:43 | 显示全部楼层
回复【5楼】Badu_Space:
---------------------------------
我是中断接收,上位机也就是串口,它一次发送了两帧过来,我不可能在在接受完第一帧延时的。这个只是初步的,我要达到的要求是,上位机按照帧结构,持续的传送数据,我要能接收的帧,吧帧中的数据存下来。或许上位机发送的就是一个文件,文件里包含了很多帧,我要收到这个文件中的数据 。这该怎么实现,当前我市一帧一帧发送接收可以的,要发送文件,接收该怎么办?求助。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-9-30 12:18:45 | 显示全部楼层
回复【8楼】victor3l:
---------------------------------
可以这样啊,接收一帧数据正确之后先保存这帧数据,清空缓存,然后再接收下一帧数据,这样循环来。接收到的数据通过串口将接收信息返回上位机,这样来查看问题所在啊,接收到什么数据就复制这个数据返回,再保存这个数据
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

28

主题

1489

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1656
金钱
1656
注册时间
2013-7-24
在线时间
1 小时
发表于 2013-9-30 17:26:47 | 显示全部楼层
有帧结束判断啊,
/下面表示接收数据个数正确,接收到报文尾,校验位正确
if((datNum == (num-6)) && (USART_RX_BUF[num-1] == 0x0D) && (check == USART_RX_BUF[num-2]))
{
num = 0;//准备接收下一帧
rcvRightFlg = 1;//接收1帧正确。
}
当rcvRightFlg = 1就表示收到一帧了

---------------------------------

嗯,看到了,是有。
不过你begin为1就去处理数据时机不对。
于20150522停用该账号:http://www.microstar.club
回复 支持 反对

使用道具 举报

79

主题

127

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
465
金钱
465
注册时间
2013-2-19
在线时间
1 小时
 楼主| 发表于 2013-10-5 15:05:14 | 显示全部楼层
回复【10楼】styleno1:

有帧结束判断啊,
/下面表示接收数据个数正确,接收到报文尾,校验位正确
if((datNum == (num-6)) && (USART_RX_BUF[num-1] == 0x0D) && (check == USART_RX_BUF[num-2]))
{
num = 0;//准备接收下一帧
rcvRightFlg = 1;//接收1帧正确。
}
当rcvRightFlg = 1就表示收到一帧了

---------------------------------
嗯,看到了,是有。
不过你begin为1就去处理数据时机不对。

---------------------------------
回复【10楼】styleno1:
---------------------------------
那该什么时候处理?
回复 支持 反对

使用道具 举报

7

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2014-6-14
在线时间
1 小时
发表于 2015-6-17 00:21:35 | 显示全部楼层
后面进行怎么样了呢
回复 支持 反对

使用道具 举报

8

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2017-3-12
在线时间
27 小时
发表于 2017-6-10 23:35:10 | 显示全部楼层
楼主可以把这个程序分享一下吗,新手想学习怎么写串口协议
回复 支持 反对

使用道具 举报

8

主题

50

帖子

0

精华

初级会员

Rank: 2

积分
119
金钱
119
注册时间
2017-3-12
在线时间
27 小时
发表于 2017-6-11 10:13:48 来自手机 | 显示全部楼层
楼主可以把程序分享一下吗
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2015-6-12
在线时间
14 小时
发表于 2017-6-11 18:26:59 | 显示全部楼层
参考我在这个帖子的回复,如果最佳答案是楼主选择的,那我估计这位楼主的问题和那位楼主一样,解决方案也一样
http://www.openedv.com/forum.php?mod=viewthread&tid=103476
回复 支持 反对

使用道具 举报

2

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2015-6-12
在线时间
14 小时
发表于 2017-6-11 19:09:27 | 显示全部楼层
刚刚我去修改了那个帖子,做了补充说明。
如果楼主发送的数据帧很短,波特率很快,那可能主函数永远不够时间去处理一帧数据,这样无论如何都会丢失数据帧。所以最好做个应答机制,这边处理完了应答一个数据,那边接到应答再发第二帧。在大量数据传输,又不允许任何错误和遗漏的情况下,必须使用这个方法,如IAP烧录。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-18 15:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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