关于串口实验的一点疑问:电脑发送数据比程序处理快的情况下

2019-07-20 13:38发布

        串口实验的中断里前面几句是这样写的:
      if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
           {
                Res =USART_ReceiveData(USART1);//(USART1->DR);        //读取接收到的数据
               
                if((USART_RX_STA&0x8000)==0)//接收未完成
        {
              、、、、、、、

       }

     意思是当状态标志变量最高位为1时则不进行余下的操作,我在主程序中加了delay_ms(500);    的语句,然后让串口每50ms,发一次数据,
    按照程序的意思,这种情况下,主程序来不及处理,新的接收又开始了,由于USART_RX_STA最高位未在主函数中清零,接收被忽略,
    这样当主程序处理了接收,中断中再次处理新的接收时,这时候好多数据被忽略了,接收应该不完整了,但是调试助手上看数据没问题啊?
   为什么呢?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
samglz
1楼-- · 2019-07-20 17:47
因为串口调试助手,它有一个缓冲区,每中断一次可以把缓冲区的数据全部都出来
lanlzp
2楼-- · 2019-07-20 21:52
 精彩回答 2  元偷偷看……
卢飞跃
3楼-- · 2019-07-20 22:33
samglz 发表于 2017-6-28 15:57
因为串口调试助手,它有一个缓冲区,每中断一次可以把缓冲区的数据全部都出来

但是怎么接不到的收是stm32控制的啊?虽然取出来了,但是控制器的程序控制是接收不到的啊
卢飞跃
4楼-- · 2019-07-21 01:09
lanlzp 发表于 2017-6-29 10:01

在主程序中加了delay_ms(500);    的语句,然后让串口每50ms,发一次数据。
...

但是,按照程序上来看,如果主程序没把接收到的数据发送之前,(USART_RX_STA&0x8000=1),此时是不会将数据存到缓冲区的啊:程序的判断语句:if((USART_RX_STA&0x8000)==0),
卢飞跃
5楼-- · 2019-07-21 03:00
 精彩回答 2  元偷偷看……
卢飞跃
6楼-- · 2019-07-21 07:40
lanlzp 发表于 2017-6-29 10:01

在主程序中加了delay_ms(500);    的语句,然后让串口每50ms,发一次数据。
...

例程是每次先接收一个数据,然后判断是否主程序处理了原来的数据,这样的话,并不能确定这个数据是否是第一个数据啊!如果不是,这时候进行数据处理,不是要丢失前面的数据了吗?

一周热门 更多>