打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
串口接收中断和连续发送的矛盾!

http://blog.csdn.net/u011964923/article/details/49020451

2015

出现的问题:为什么我配置的串口中断,只能接收到数据头和尾?PC发送123,我接收到13;PC发送12345,我接收到15。 波特率也是匹配的呀,怎么就漏接了中间部分呢?


暂时想到的原因:因为串口接收中断服务程序也是需要时间来执行的,所以试想一下: MCU的串口外设在接收到二个数据的时候,MCU的主核正在执行第一个数据触发的中断服务程序,所以第二个数据触发的中断函数并未执行!如果波特率很高,那么中断服务程序就相对时间很长,这样,MCU接收到第三个数据,MCU仍在第一个中断函数里执行,但串口接收寄存器被覆盖了!直到MCU接收到最后一个数据,串口接收寄存器稳定为最后一个数据(因为没有下一个数据来覆盖它),这是等待第一个中断服务函数结束,执行最后一个中断服务程序。  这就是为什么只接收到数据头和数据尾的假象了,实际是都接收到了,但中断服务程序并没有全部执行!!


解决办法: 1、降低波特率,留下充裕的时间给中断服务程序来执行(治标)

     2、简化串口接收中断服务程序,尽量以最短的时间结束第一个中断服务程序,be ready immedately for the next ISR。 当然,最后一个数据触发的中断服务函数可以很长,因为无需等待下一个数据了。


比如这样:
#pragma vector=USART0RX_VECTOR //to display what the MCU just received
__interrupt void usart0_rx(){


static uchar i=0;
R_Buffer[i++]=RXBUF0;                                        //总共接收16个数据,非最后一个数据触发的中断,只执行这一句。


if(i==16){   //最后一个数据触发的中断,执行If语句里的程序
for(i=0;i<16;i++){
lcd_write_data(R_Buffer[i]);
}
i=0;

TXBUF0=0XF5;
while((UTCTL0 & 0X01)==0);
TXBUF0=0X09;
while((UTCTL0 & 0X01)==0);
TXBUF0=0X00;
while((UTCTL0 & 0X01)==0);
TXBUF0=0X00;
while((UTCTL0 & 0X01)==0);
TXBUF0=0X00;
while((UTCTL0 & 0X01)==0);
TXBUF0=0X00;
while((UTCTL0 & 0X01)==0);
TXBUF0=0X09;
while((UTCTL0 & 0X01)==0);
TXBUF0=0XF5;
while((UTCTL0 & 0X01)==0);
}
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
串口打印你知道多少?
STM32HAL库与标准库的区别
轻松学PIC之RS232串口通信篇
linux串口编程 非规范模式 read()问题
STC51入门笔记(郭天祥C语言)
单片机串口通信编程注意事项
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服