打印

串口协议帧设计问题

[复制链接]
1354|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
victor3l|  楼主 | 2013-9-29 14:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我弄一个串口数据帧格式:
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;//准备接收下一帧
                rcvRight标志寄存器 = 1;//接收1帧正确。                       
        }               
}

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


相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

77

主题

308

帖子

5

粉丝