OpenEdv-开源电子网

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

为什么教程串口实验里,清除标志位无用,接收的数据累计到下一次

[复制链接]

2

主题

19

帖子

0

精华

新手上路

积分
44
金钱
44
注册时间
2020-8-20
在线时间
12 小时
发表于 2021-3-13 23:47:35 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 couragemars 于 2021-3-13 23:53 编辑
  1. void USART1_IRQHandler(void)                        //串口1中断服务程序
  2. {
  3.         u8 Res;
  4.             if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  5.                     Res =USART_ReceiveData(USART1);//(USART->DR);        //读取接收到的数据
  6.                     if((USART_RX_STA&0x8000)==0){//接收未完成
  7.                             if(USART_RX_STA&0x4000){//接收到了0x0d
  8.                                     if(Res!=0x0A)USART_RX_STA=0;//接收错误,重新开始
  9.                                     else USART_RX_STA|=0x8000;        //接收完成了
  10.                             }else{ //还没收到0X0D
  11.                                     if(Res==0x0D)USART_RX_STA|=0x4000;
  12.                                     else{
  13.                                             USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ; //将收到的数据放入数组
  14.                                             USART_RX_STA++;        //数据长度计数加1
  15.                                             if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
  16.                                     }
  17.                             }
  18.                     }
  19.             }
  20. #if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  21.         OSIntExit();                                                                                          
  22. #endif
  23. }
复制代码
这是原子哥教程串口实验源码里的中断程序,我在主程序里判断数组内容,程序如下:
  1.     while(1)
  2.     {
  3.         if(USART_RX_STA&0x8000)
  4.         {
  5.             if(USART_RX_BUF[0]==0x31 && USART_RX_BUF[1]==0x32 && USART_RX_BUF[2]==0x33)
  6.             {
  7.                 USART_RX_STA=0;
  8.                 delay_ms(50);
  9.                 printf("321\r\n");
  10.                                                         
  11.             }
  12.             if(USART_RX_BUF[2]==0x34 && USART_RX_BUF[3]==0x35 && USART_RX_BUF[4]==0x36)
  13.             {
  14.                 USART_RX_STA=0;
  15.                 delay_ms(50);
  16.                 printf("654\r\n");
  17.             }

  18. //                        len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
  19. //                        for(t=0;t<len;t++)
  20. //                        {
  21. //                                USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
  22. //                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
  23. //                        }
  24.             USART_RX_STA=0;
  25.         }
  26.     }
复制代码
接收到123时,单片机回复321,接收到456时,单片机回复654。由于我屏蔽了将数组内容返回的代码,当我上一次发送123并回复321后,如果我接着发送0x0d 0x0a,单片机依然会回复321,而不是无反应,换成456也是这样,这与我想象的不同,
思来想去,清除标志位是不影响缓存的数组内容,可标志位从零开始了,那下一次接受数据应该会直接覆盖呀?就算发送的是回车换行,没有数据不覆盖,上一次的数组也不可能还保留标志位啊,这是为啥?

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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 14:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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