野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9304|回复: 9

求助贴:串口接收中断有段代码不理解

[复制链接]
发表于 2015-10-28 23:40:07 | 显示全部楼层 |阅读模式
void USART2_IRQHandler()   
{  
if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中断产生
{   
USART_ClearITPendingBit(USART2,USART_IT_RXNE);//清楚标志位
Uart2_Buffer[Uart2_Rx_Num] = USART_ReceiveData(USART2);
Uart2_Rx_Num++;  
}   
if((Uart2_Buffer[0] == 0x5A)&&(Uart2_Buffer[Uart2_Rx_Num-1] == 0xA5))  //判断最后接收的数据是否为设定值,确定数据正确性
Uart2_Sta=1;
if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢出
{
USART_ClearFlag(USART2,USART_FLAG_ORE);  //SR
USART_ReceiveData(USART2); //DR   
}      
}   

void main()
{
……
if( Uart2_Sta )
{
for(Uart2_Tx_Num=0;Uart2_Tx_Num < Uart2_Rx_Num;Uart2_Tx_Num++)  
USART2_SendByte(Uart2_Buffer[Uart2_Tx_Num]); //发送数据   
Uart2_Rx_Num = 0; //初始化
Uart2_Tx_Num = 0;
Uart2_Sta = 0;
}
}
这是接收数据然后发送数据的代码。
中间红色那段看不懂,请大神帮忙理解下,谢谢。

回复

使用道具 举报

发表于 2015-10-29 08:39:00 | 显示全部楼层
检查标志位,然后读取数据
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-10-29 22:40:50 | 显示全部楼层
flyleaf 发表于 2015-10-29 08:39
检查标志位,然后读取数据

我不清楚是什么位置位,因什么原因产生的。
回复 支持 反对

使用道具 举报

发表于 2015-10-30 09:07:20 | 显示全部楼层
Crazy猛鸡 发表于 2015-10-29 22:40
我不清楚是什么位置位,因什么原因产生的。

哦,这个确实。。F1的文档里也没有ORE标志的说明,不太清楚了,还是这个标志是自己定制的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-2 15:38:46 | 显示全部楼层
flyleaf 发表于 2015-10-30 09:07
哦,这个确实。。F1的文档里也没有ORE标志的说明,不太清楚了,还是这个标志是自己定制的?

不是喔,是自带的。
回复 支持 反对

使用道具 举报

发表于 2015-11-2 16:17:43 | 显示全部楼层
求助,为什么我调试串口2没反应    http://www.firebbs.cn/thread-10105-1-1.html
回复 支持 反对

使用道具 举报

发表于 2015-11-3 10:06:19 | 显示全部楼层
Crazy猛鸡 发表于 2015-11-2 15:38
不是喔,是自带的。

USART的状态寄存器bit3就是ORE位,当我们接收到的数据从接收移位寄存器转移到RDR寄存器(接收数据寄存器)的时候,这个位就会被硬件置1。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-11-3 22:43:09 | 显示全部楼层
liutao 发表于 2015-11-3 10:06
USART的状态寄存器bit3就是ORE位,当我们接收到的数据从接收移位寄存器转移到RDR寄存器(接收数据寄存器) ...

你的意思应该指的是USART_GetITStatus(USART2,USART_IT_RXNE)这段代码
回复 支持 反对

使用道具 举报

发表于 2015-11-4 09:21:57 | 显示全部楼层
Crazy猛鸡 发表于 2015-11-3 22:43
你的意思应该指的是USART_GetITStatus(USART2,USART_IT_RXNE)这段代码

不是的,我说的就是红色那一段,可能我表达能力不好,这么说吧 只要我们设置了RXNELE=1(允许串口接收中断)代码体现在USART_ITConfig(USART2,USART_IT_RXNE,ENABLE),要想产生RXNE中断,必须把串口控制寄存器控制寄存器中的RXNELE这个位置1,这时候只要串口收到数据便会把串口状态寄存器中的RXNE和ORE位都置1(数据从移位寄存器转移到RDR寄存器这两位会被置1,),这时候请注意 当RXNELE=1时,RXNE或者ORE任意一个置位 置1都可以产生串口中断,在你的中断程序里面第一个if判断只清除了RXNE这个标志位,ORE位却还没有清除,红色代码部分的作用就是清除被同时置1了的ORE位
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2015-11-4 14:33:58 | 显示全部楼层
liutao 发表于 2015-11-4 09:21
不是的,我说的就是红色那一段,可能我表达能力不好,这么说吧 只要我们设置了RXNELE=1(允许串口接收中 ...

谢谢。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-9-22 04:24 , Processed in 0.045389 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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