您的位置:首页 > 其它

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

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

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: