PIC单片机串口接收进不了中断,发送正常
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PIC单片机串口接收进不了中断,发送正常相关的知识,希望对你有一定的参考价值。
unsigned char temp;
void main(void)
TRISA=0xfe;
PORTA=0x00;
/*串口波特率及中断配置*/
TRISB=0XFD;//RB1是TX,RB4是RX。
PORTB=0;
TXSTA=0X20;//异步低速,TXEN置位,使能发送
RCSTA=0X90;//使能串行端口SPEN置1,使能接收器CREN置1
BRG16 =1;//十六位波特率寄存器使能
SPBRGH = 0x00;
SPBRG = 0x33;//配置波特率为9600
RCIE=1;//串口接收中断使能
RCREG=0;
TXIE=0;
/*总的中断开启配置*/
GIE=1;
PEIE=1;
TXREG=0X18;
while(!TRMT);//发送完成查询,发送没问题。
while(1)
void interrupt isr(void)//PIC中断
TXREG=0X18;
temp=RCREG;
while(!TRMT);//发送完成查询,发送没问题。
LED=~LED;
STM32 USART接收中断程序问题
我自己编程学习,提取串口发送的5个字节中的第三个字节,用来作判断。现在我用串口调试助手发送5个16进制的字节,试验了好几次,发现串口接收中断一直在循环,存在问题,调不到我所想要的结果,希望各位高手帮忙!我对串口的配置如下:
void USART1_IRQHandler(void)接收中断函数中一直循环,可能是你中断函数的处理程序太多了,导致延时太大,建议你直接在中断处理函数里只放些标志位,中断就改变标志位,在主循环中根据标志位处理判断。并且最好再提高系统时钟频率。你用的115200的速度,有点高!追问
我发现USART_ClearITPendingBit(USART1,USART_IT_RXNE)指令,清不掉RXNE标志位,导致RXNE=1,一直在进接收中断去,你遇到过这情况么?
追答之所以清不掉中断标记,很可能是它中断间隔太短了,导致清掉了,之后又马上进入中断了!
追问应该不会的,我是用Keil单步执行,进行检测的,当我执行过USART_ClearITPendingBit函数后,清不掉,但我发现另一个发送的TXE标志位能软件清除
追答那你可以自己对这个USART_ClearITPendingBit函数用寄存器操作的方式实现,再看效果
追问没有效果,感觉这个库函数USART_ClearITPendingBit()有问题。。。。。。
参考技术A用这个试试:
if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET)
USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR其实就是清除标志
USART_ReceiveData(USART2); //读DR
追问
谢谢你!问题已经找到了,是之前对串口配置的程序顺序出错了,无奈只能采纳一个人的答案
参考技术B 在哪个函数里循环? 你只发一次,结果串口一直中断?追问void USART1_IRQHandler(void)接收中断函数中一直循环,我即使不从串口助手发数据,这中断函数也一直在循环,怎样配置使得我发完一个字节,接收中断收到后就停下来?
追答你用示波器看一下,你的RX口是不是电平不稳定?
追问汗啊!没有示波器,看不起来~我经过调试程序,发现USART_ClearITPendingBit(USART1,USART_IT_RXNE)指令,清不掉RXNE标志位,导致RXNE=1,一直在进接收中断去,你遇到过这情况么?
追答试一下:
把USART_ClearITPendingBit(USART1,USART_IT_RXNE) 放到 if(buffer_size == 0)的前面
谢谢你!问题已经找到了,是之前对串口配置的程序顺序出错了,无奈只能采纳一个人的答案
以上是关于PIC单片机串口接收进不了中断,发送正常的主要内容,如果未能解决你的问题,请参考以下文章
STM8S单片机串口UART2接收中断一直在运行,出不来,怎么回事?