亚博智能论坛  
  
查看: 665|回复: 2

串口接收问题

[复制链接]
  • TA的每日心情
    萌哒
    2018-9-3 14:41
  • 20

    主题

    32

    帖子

    104

    积分

    菜鸟程序猿

    Rank: 2

    积分
    104
    发表于 2017-6-20 12:25:13 | 显示全部楼层 |阅读模式
    在串口中断内,判断接收到的数据是否正确,头,尾和 数量
    怎么也无法实现?求帮助

    发送的数据  历程   16进制    7b 00 00 00 00 00 00 01 00 00 01 00 00 00 00 00 00 00 00 7d

    USART_RX_STA功能有小改变。

    串口接收中断处理的问题

    1. void USART1_IRQHandler(void)                        //串口1中断服务程序
    2.         {
    3.                 u8 Res;
    4.                 /*
    5.                         判断头尾
    6.                         //接收状态
    7.                         //bit15,        接收完成标志                0x8000                                1000
    8.                         //bit14,        接收到0x7d                 0x4000                尾                0100
    9.                         //bit13                接收到0x7a                0x2000                头                0010
    10.                         //bit12~0,        接收到的有效字节数目
    11.                         u16 USART_RX_STA=0;       //接收状态标记        
    12.                 */               
    13.                 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
    14.                 {
    15.                                 
    16.                         Res =USART_ReceiveData(USART1);//(USART1->DR);        //读取接收到的数据
    17.                         USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除中断标志
    18.                         if((USART_RX_STA&0x8000)==0)//接收未完成
    19.                         {
    20.                                 if(USART_RX_STA&0x6000)//接收到了tou  wei
    21.                                         {
    22.                                                 if((USART_RX_STA&0X1FFF)>USART_REC_LEN-1)
    23.                                                 {
    24.                                                         USART_RX_STA=0;//接收错误,重新开始
    25.                                                 }
    26.                                                 else
    27.                                                 {
    28.                                                         USART_RX_STA|=0x8000;
    29.                                                 }        //接收完成了
    30.                                         }
    31.                                 else // 收到0x7d
    32.                                         {        
    33.                                                 if(USART_RX_BUF[0]==0x7b)   //tou
    34.                                                         {
    35.                                                                 USART_RX_STA|=0x2000;
    36.                                                         }               
    37.                                                 if(USART_RX_BUF[USART_REC_LEN-1]=0x7d)        // wei
    38.                                                         {
    39.                                                                 USART_RX_STA|=0x4000;
    40.                                                         }
    41.                                         else
    42.                                                 {
    43.                                                         USART_RX_BUF[USART_RX_STA&0X1FFF]=Res ;
    44.                                                         USART_RX_STA++;
    45.                                                         if((USART_RX_STA&0X1FFF)>(USART_REC_LEN-1))
    46.                                                         {
    47.                                                                 USART_RX_STA=0;
    48.                                                         }//接收数据错误,重新开始接收         
    49.                                                 }                 
    50.                                         }
    51.                         }
    52.                 }
    53.         }        
    复制代码

    主函数 判断
    1. if(USART_RX_STA&0x8000)               
    2. {
    3. .......

    4. }
    复制代码


    回复

    使用道具 举报

  • TA的每日心情
    郁闷
    2017-8-12 18:11
  • 8

    主题

    17

    帖子

    52

    积分

    菜鸟程序猿

    Rank: 2

    积分
    52
    发表于 2017-6-23 16:50:22 | 显示全部楼层
    当主函数在处理数据时,中断可能还在发生。所以你处理的数据,可能一半是上一次发的,一半是这一次发的。
    这种问题有两个方案:
    1、做个全局互锁开关,通讯完毕了打开开关,只要开关开着,就不能再接收数据。主函数判断开关,如果开着就处理数据,处理完了就关掉开关。
    2、做两个缓存数组,一个用于实时接收,接收完毕了用memcpy函数拷贝到另一个数组。主函数永远只能处理另一个数组的数据。如果缓存太大怕memcpy函数执行太久影响中断,就做指针切换也行。接收完了指针就切换过去,主函数永远通过这个指针去取数组。
    补充说明一下,第二个方案只适合于主函数运行足够快,能够实时处理完每一帧数据的情况,即,在处理数据时,那边又开始接受数据,这没问题,但是在接收完成数据开始memcpy时,就得考虑主函数是否已经处理完了。如果这个无法保证,就必定会有冲突,只能使用第一个方案,放弃某些帧。如果主函数轮询太慢,可以考虑设置软中断,接收完一帧后触发软中断去处理数据,这样最节约时间。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    23

    主题

    54

    帖子

    149

    积分

    菜鸟程序猿

    Rank: 2

    积分
    149
    发表于 2017-6-23 16:50:50 | 显示全部楼层
    搞不懂串口通信协议为什么要这么处理
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

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