单片机 > 单片机程序设计 > 详情

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

发布时间:2020-08-21 发布时间:
|

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


关键字:串口接收  中断  连续发送 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
C8051F020的UART