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

出现的问题:为什么我配置的串口中断,只能接收到数据头和尾?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);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值