OpenEdv-开源电子网

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

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

[复制链接]

10

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-7-12
在线时间
35 小时
发表于 2017-6-28 08:05:10 | 显示全部楼层 |阅读模式
1金钱
        串口实验的中断里前面几句是这样写的:
      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最高位未在主函数中清零,接收被忽略,
    这样当主程序处理了接收,中断中再次处理新的接收时,这时候好多数据被忽略了,接收应该不完整了,但是调试助手上看数据没问题啊?
   为什么呢?

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

使用道具 举报

5

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
171
金钱
171
注册时间
2016-1-19
在线时间
44 小时
发表于 2017-6-28 15:57:55 | 显示全部楼层
因为串口调试助手,它有一个缓冲区,每中断一次可以把缓冲区的数据全部都出来
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-6-29 10:01:47 | 显示全部楼层
本帖最后由 lanlzp 于 2017-6-29 10:02 编辑



在主程序中加了delay_ms(500);    的语句,然后让串口每50ms,发一次数据。
原子有定义接收缓冲区,短时间应该没问题,时间长了确实会出现数据丢失的情况
回复

使用道具 举报

10

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-7-12
在线时间
35 小时
 楼主| 发表于 2017-7-4 09:45:37 | 显示全部楼层
samglz 发表于 2017-6-28 15:57
因为串口调试助手,它有一个缓冲区,每中断一次可以把缓冲区的数据全部都出来

但是怎么接不到的收是stm32控制的啊?虽然取出来了,但是控制器的程序控制是接收不到的啊
回复

使用道具 举报

10

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-7-12
在线时间
35 小时
 楼主| 发表于 2017-7-4 09:49:56 | 显示全部楼层
lanlzp 发表于 2017-6-29 10:01

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

但是,按照程序上来看,如果主程序没把接收到的数据发送之前,(USART_RX_STA&0x8000=1),此时是不会将数据存到缓冲区的啊:程序的判断语句:if((USART_RX_STA&0x8000)==0),
回复

使用道具 举报

10

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-7-12
在线时间
35 小时
 楼主| 发表于 2017-7-4 20:48:56 | 显示全部楼层
samglz 发表于 2017-6-28 15:57
因为串口调试助手,它有一个缓冲区,每中断一次可以把缓冲区的数据全部都出来

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

使用道具 举报

10

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-7-12
在线时间
35 小时
 楼主| 发表于 2017-7-4 20:49:14 | 显示全部楼层
lanlzp 发表于 2017-6-29 10:01

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

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

使用道具 举报

10

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2016-7-12
在线时间
35 小时
 楼主| 发表于 2017-7-4 20:49:51 | 显示全部楼层
samglz 发表于 2017-6-28 15:57
因为串口调试助手,它有一个缓冲区,每中断一次可以把缓冲区的数据全部都出来

我自己的程序之前是这样的,void USART3_IRQHandler()
{
   u8 i;
   if(USART_GetITStatus(USART3,USART_IT_RXNE))
         {

    //rxdata[status&0x3FFF]=USART_ReceiveData(USART3); //已经注释掉
     if((status&0x8000)==1)
     {
      status=0;
      for(i=0;i<USART_REC_LENGTH;i++)
      rxdata=0;           
     }      //没有发送,作废        ,溢出中断处理异常
    //{
                         if((status&0x8000)==0)
                 {         
                  if(USART_ReceiveData(USART3)==0x0d)
                             status|=0x4000;                      
            else if(USART_ReceiveData(USART3)==0x0a)   
                        {
                                if((status&0x4000)==0x4000)                            
                                   status|=0x8000;
                           else
                                        status&=0x3FFF;   
                             
                        }
                rxdata[status&0x3FFF]=USART_ReceiveData(USART3);                                                    
                                   status+=1;                                           
                     if((status&0x3FFF)>200-1)
                                           status=0;                                      
                 }
         }
}   

用上面的程序,一旦发送快了,例如每50ms发一次,程序就卡死了,
我把rxdata[status&0x3FFF]=USART_ReceiveData(USART3);        这一句放到了上断程序加粗的位置,结果就不卡死了。程序正常运行。这是个新问题。
问题是,我的程序意思是:如果主程序未处理,就舍弃上一帧数据,
但是,例程是每次先接收一个数据,然后判断是否主程序处理了原来的数据,这样的话,并不能确定这个数据是否是第一个数据啊!
如果不是,这时候进行数据处理,不是要丢失前面的数据了吗?

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 09:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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