OpenEdv-开源电子网

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

stm32的usart3中断接收会丢失字节

[复制链接]

6

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
419
金钱
419
注册时间
2013-12-6
在线时间
46 小时
发表于 2014-9-26 11:13:24 | 显示全部楼层 |阅读模式
5金钱
我发现usart3中断接收的数据会丢失,增加一个监控进入中断的变量,我发送了8个字节的数据到STM32的usart3,但是接收到了7个字节,检查中断进入的次数也是7,我usart3的波特率为19200,应该不会太快呀,设置的中断优先级是MY_NVIC_Init(0,1,USART3_IRQn,2),已经是我程序里面中断优先级最高的,这个数据丢失是发送10次,会有2次产生这种问题。
发送截图:


接收的数据:


enter_int_num是进入中断的次数,郁闷了好久。

最佳答案

查看完整内容[请看2#楼]

回复【6楼】yqiqi: 你这是在os上跑的吗? 可以先试一下裸机跑的时候会不会有这样的问题。 我不相信是stm32外设的问题,大家都用了那么久,基本没有遇到过这样的问题,即使有类似的,也都是程序设计导致的。
有人问我会什么?我低头看看我手里的书,我发现我只会用。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2014-3-12
在线时间
9 小时
发表于 2014-9-26 11:13:25 | 显示全部楼层
回复【6楼】yqiqi:
你这是在os上跑的吗?
可以先试一下裸机跑的时候会不会有这样的问题。
我不相信是stm32外设的问题,大家都用了那么久,基本没有遇到过这样的问题,即使有类似的,也都是程序设计导致的。
功夫再高、也怕羊刀
回复

使用道具 举报

1

主题

93

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2014-3-12
在线时间
9 小时
发表于 2014-9-26 11:13:25 | 显示全部楼层
回复【9楼】yqiqi:
---------------------------------
那你考虑下是不是因为在某个地方
“从进入临界代码段,到退出临界代码段”
占用时间比较长(足够覆盖一个字节的接收时间)。

我建议尝试修改临界代码段作为测试:
OSIntEnter();//在内部增加一句GPIO拉高电平的语句
OSIntExit();//在内部增加一句GPIO拉低电平的语句
然后用示波器捕获脉冲,测量持续时间最长那个脉冲的脉宽。
功夫再高、也怕羊刀
回复

使用道具 举报

6

主题

27

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
306
金钱
306
注册时间
2013-2-26
在线时间
20 小时
发表于 2014-9-26 11:31:10 | 显示全部楼层
应该不会吧,我用过多次呢,能不能把问题详细说明,或者贴代码!
坚持,有一天你会成功!
回复

使用道具 举报

6

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
419
金钱
419
注册时间
2013-12-6
在线时间
46 小时
 楼主| 发表于 2014-9-26 11:41:03 | 显示全部楼层
回复【2楼】冷焰寒冰:
---------------------------------
//串口初始化
void usart3_init(u32 pclk1,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;    
temp=(float)(pclk1*1000000)/(bound*16);//得到USARTDIV
mantissa=temp;  //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分  
     mantissa<<=4;
mantissa+=fraction; 
RCC->APB2ENR|=1<<3;   //使能PORTB口时钟  
RCC->APB1ENR|=1<<18;  //使能串口时钟 
GPIOB->CRH&=0XFFFF00FF;//IO状态设置,PB10,PB11
GPIOB->CRH|=0X00008B00;//IO状态设置
  
RCC->APB1RSTR|=1<<18;   //复位串口2
RCC->APB1RSTR&=~(1<<18);//停止复位        
//波特率设置
  USART3->BRR=mantissa; // 波特率设置  
USART3->CR1|=0X200C;  //1位停止,无校验位.
//使能接收中断
USART3->CR1|=1<<8;    //PE中断使能
USART3->CR1|=1<<5;    //接收缓冲区非空中断使能     
MY_NVIC_Init(0,1,USART3_IRQn,2),
}
//串口中断接收
void USART3_IRQHandler(void)
{
OSIntEnter();
enter_int_num++;//进入中断的次数
if(USART3->SR&(1<<5))//接收到数据
{  
if(recv_count>=RECV_SIZE){
recv_count = 0;
}
recv_buff[recv_count++]  = USART3->DR;//循环接收 
OSSemPost(recv_sem);
}
OSIntExit();
}
不好意思,我开启了usart3的中断接收功能,初始化usart3的波特率为19200,8位数据位,无校验位,1个停止位,发送(saveOK),发现usart3接收有时候会丢失数据,检查usart3中断进入次数,发现也不对。
有人问我会什么?我低头看看我手里的书,我发现我只会用。
回复

使用道具 举报

6

主题

27

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
306
金钱
306
注册时间
2013-2-26
在线时间
20 小时
发表于 2014-9-26 13:26:05 | 显示全部楼层
回复【3楼】yqiqi:
---------------------------------
你的数据是任意接收吗,有没有帧头和帧尾
坚持,有一天你会成功!
回复

使用道具 举报

6

主题

27

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
306
金钱
306
注册时间
2013-2-26
在线时间
20 小时
发表于 2014-9-26 13:45:03 | 显示全部楼层
回复【3楼】yqiqi:
---------------------------------
看了程序,感觉你的问题在于没有帧头,与帧尾。利用计数的方式有些不太可取。看到你发的数据有(,),建议用这对()作为你数据的开始字节,与结束字节!
坚持,有一天你会成功!
回复

使用道具 举报

6

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
419
金钱
419
注册时间
2013-12-6
在线时间
46 小时
 楼主| 发表于 2014-9-26 14:01:24 | 显示全部楼层
回复【5楼】冷焰寒冰:
---------------------------------
谢谢,你说这么多,关键问题是现在进入接收中断次数不对,按道理是我这边发送8个字节,stm32的串口接收中断应该到产生8次,我用了变量检查发现,进入中断的次数就是7次,现在问题是还有一次中断什么原因丢失的,我的建议是不要在中断里面判断帧头,与帧尾,会消耗中断时间,所以我创建了一个任务,在任务里面判断recv_sem信号量,进行帧头,与帧尾的判断和获取正确的数据包。再次感激你回答我的问题。
有人问我会什么?我低头看看我手里的书,我发现我只会用。
回复

使用道具 举报

6

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
419
金钱
419
注册时间
2013-12-6
在线时间
46 小时
 楼主| 发表于 2014-9-26 15:43:55 | 显示全部楼层
回复【7楼】加速度:
---------------------------------
好,多谢,我试试。
有人问我会什么?我低头看看我手里的书,我发现我只会用。
回复

使用道具 举报

6

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
419
金钱
419
注册时间
2013-12-6
在线时间
46 小时
 楼主| 发表于 2014-9-26 16:48:09 | 显示全部楼层
初步查看,裸机跑是没有任何问题的,现在应该就是程序的问题。
有人问我会什么?我低头看看我手里的书,我发现我只会用。
回复

使用道具 举报

6

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
419
金钱
419
注册时间
2013-12-6
在线时间
46 小时
 楼主| 发表于 2014-9-27 11:10:08 | 显示全部楼层
回复【10楼】加速度:
---------------------------------
说的很对呀,我试试。
有人问我会什么?我低头看看我手里的书,我发现我只会用。
回复

使用道具 举报

6

主题

82

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
419
金钱
419
注册时间
2013-12-6
在线时间
46 小时
 楼主| 发表于 2014-9-27 12:04:21 | 显示全部楼层
回复【10楼】加速度:
---------------------------------
果然厉害,真的是进入临界区的时间太长了,让串口中断没法响应,兄弟忍不住为你点个赞,。
有人问我会什么?我低头看看我手里的书,我发现我只会用。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-1 03:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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