串口协议帧设计问题

2019-08-17 08:31发布

我弄一个串口数据帧格式:
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时能收到
但是当我把他们放在一起发送时,就只能收到前面的数据,收到后面的数据是错误的。
我在程序中是按帧来接收数据的,不知道为什么?
另外,在实际应用需求是通过上位机吧数据按照帧格式打包,然后一帧一帧持续发送的,这种情况该怎样做了?
谢谢大家。













友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
victor3l
1楼-- · 2019-08-18 08:55
回复【5楼】Badu_Space:
---------------------------------
我是中断接收,上位机也就是串口,它一次发送了两帧过来,我不可能在在接受完第一帧延时的。这个只是初步的,我要达到的要求是,上位机按照帧结构,持续的传送数据,我要能接收的帧,吧帧中的数据存下来。或许上位机发送的就是一个文件,文件里包含了很多帧,我要收到这个文件中的数据 。这该怎么实现,当前我市一帧一帧发送接收可以的,要发送文件,接收该怎么办?求助。
八度空间
2楼-- · 2019-08-18 13:55
回复【8楼】victor3l:
---------------------------------
可以这样啊,接收一帧数据正确之后先保存这帧数据,清空缓存,然后再接收下一帧数据,这样循环来。接收到的数据通过串口将接收信息返回上位机,这样来查看问题所在啊,接收到什么数据就复制这个数据返回,再保存这个数据
styleno1
3楼-- · 2019-08-18 19:44
有帧结束判断啊,
/下面表示接收数据个数正确,接收到报文尾,校验位正确
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就去处理数据时机不对。
victor3l
4楼-- · 2019-08-19 01:34
回复【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:
---------------------------------
那该什么时候处理?
tiget327
5楼-- · 2019-08-19 07:00
 精彩回答 2  元偷偷看……
yinqirui9
6楼-- · 2019-08-19 07:30
楼主可以把这个程序分享一下吗,新手想学习怎么写串口协议

一周热门 更多>