OpenEdv-开源电子网

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

串口接收判断接收完毕条件的优化

[复制链接]

7

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2013-1-23
在线时间
4 小时
发表于 2014-11-20 16:40:58 | 显示全部楼层 |阅读模式
原子串口文件中关于串口接收完毕的判断条件是收到回车即连续接收到0x0D,0x0A。如果在一次传送中收到了0x0D,紧接着判断下一个是不是0x0A,如果不是,就认为此次接收错误,并清除缓存。这样以来就有一个问题,假如0x0D确实是我想要传输的数据,并不是回车的开端,那么如果接下来收到的不是0x0A,就会产生数据的丢失,是否可以作以下优化:
void USART1_IRQHandler(void) //串口 1 中断服务程序
{
    u8 Res;
    #ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了 ,说明要使用 ucosII 了 .
    OSIntEnter();
    #endif
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)                                                                                                   
    { //接收中断(接收到的数据必须是 0x0d 0x0a 结尾)
        Res =USART_ReceiveData(USART1);//(USART1 ->DR); //读取接收到的数据
        if((USART_RX_STA&0x8000)==0)//接收未完成
        {
            if(USART_RX_STA&0x4000)//接收到了 0x0d
           {
                if(Res == 0x0a)
               {
                    USART_RX_STA|=0x8000; //接收完成了
                    USART_RX_STA -= 2;//剔除最后接收到的0x0d
                    return;
               }
                else if(Res != 0x0d)
               {
                   USART_RX_STA &= (~0x4000);
               }
            }
        else if(Res==0x0d)
       {
           USART_RX_STA|=0x4000;
       }
       USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
       USART_RX_STA++;
       if(USART_RX_STA>(USART_REC_LEN-1))
             USART_RX_STA=0;//接收数据溢出,重新开始接收 
     }
  }
  #ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了 ,说明要使用 ucosII 了 .
   OSIntExit();
   #endif
}





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

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1841
金钱
1841
注册时间
2014-6-27
在线时间
982 小时
发表于 2014-11-20 17:30:00 | 显示全部楼层
没有必要了,你接收的就是字符,回车就是回车,如果把0x0d,0x0a作为数据,那是另外一种数据通信格式了,那得用另外一种处理方式。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 19:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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