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

发布者:LIGANG888最新更新时间:2018-06-09 来源: eefocus关键字:串口接收  中断  连续发送 手机看文章 扫描二维码
随时随地手机看文章

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


关键字:串口接收  中断  连续发送 引用地址:串口接收中断和连续发送的矛盾!

上一篇:STM32中关于串口中断的调试
下一篇:STM32连续进中断问题+

推荐阅读最新更新时间:2024-03-16 16:05

ARM Linux 如何--注册和触发--软中断
1. 注册软中断当然是通过open_softirq 例子如下: void __init init_timers(void) { int err = timer_cpu_notify(&timers_nb, (unsigned long)CPU_UP_PREPARE, (void *)(long)smp_processor_id()); init_timer_stats(); BUG_ON(err == NOTIFY_BAD); register_cpu_notifier(&timers_nb); open_softirq(TIMER_SOFTIRQ, run_tim
[单片机]
C51---17 红外遥控(外部中断
红外遥控简介 硬件电路 基本发送与接收 NEC编码❗ 遥控器编码 C51单片机的外部中断 外部中断寄存器 红外遥控 遥控控制Num自增自减 Num再LCD上显示 main.c #include REGX52.H #include Delay.h #include LCD1602.h #include IR.h unsigned char Num; unsigned char Address; unsigned char Command; void main() { LCD_Init(); LCD_ShowString(1,1, ADDR CMD NUM ); LCD
[单片机]
C51---17 红外遥控(外部<font color='red'>中断</font>)
第八节:在定时中断函数里执行独立按键的扫描程序
开场白: 上一节讲了在主函数中利用累计定时中断的次数来实现独立按键的检测,但是如果在某些项目中,需要在主函数里间歇性地执行一些一气呵成的耗时任务,当主函数正在处理一气呵成的耗时任务时(前提是没有关闭定时器中断),这个时候如果有按键按下来,就有可能没有及时被响应到而遗漏了。在定时中断函数里处理独立按键的扫描程序,可以避免这个问题。要教会大家一个知识点:如何在上一节的基础上,略作修改,就可以在定时中断函数里处理独立按键的扫描程序。 具体内容,请看源代码讲解。 (1)硬件平台:基于朱兆祺51单片机学习板。用矩阵键盘中的S1和S5号键作为独立按键,记得把输出线P0.4一直输出低电平,模拟独立按键的触发地GND。 (2)实现
[单片机]
STM32是如何进入中断函数的
中断相信很多人都知道是什么意思,不同的任务有不同的优先级,高任务优先级会比低优先级先执行。在嵌入式系统中, 任务的调度和切换都是根据优先级来判断的。 中断可以分为软中断和硬中断。一开始接触到的一般都是软中断,软中断就是中断程序包含在主程序里面,当中断条件满足时,直接跳转到中断函数执行,然后再返回。就相当于判断语句。 刚开始接触STM32的小伙伴可能会发现main.c里面没有中断程序也没用跳转判断语句。例如:定时器中断 #include system.h #include SysTick.h #include led.h #include time.h int main() { u8 i; SysTic
[单片机]
MSP430外部中断源程序
#include msp430x41x.h unsigned int L7=~((0X01) 6); unsigned int L8=~((0X01) 7); void main(void) { WDTCTL = WDTPW + WDTHOLD; // 禁止看门狗定时器 //P1DIR |= 0x01; // 设置P1.0为输出方向 P2DIR = 0xff; //设置P2口方向为输出 P2OUT = 0xff; P2OUT |= BIT0; P1IE |= 0x10; // P1.4中断使能 P1IES |= 0x10; // P1.4设置为高低边沿中断 P1IFG &= ~
[单片机]
AVR单片机中断实现 ATmega16 INT ISR(INT0_vect)
2.21实例功能 前面例子中分别介绍了按键控制发光二极管的亮灭,但是我们注意到,在程序中需要一直检测按键的状态,这样明显的浪费了单片机的资源,降低了单片机的工作效率,。那么有没有一种方法可以让单片机不用一直检测按键的状态,而只在有按键动作时才去响应呢? 当然有!单片机中除了具有基本输入输出功能的作用外,还有专门检测外界信号并作出响应的中断系统。在本例中,通过利用外部中断实现单片机对按键事件的响应和处理。 本例中三个功能模块描述如下: ● 单片机系统:对按键事件产生的中断时间作出响应,并在数码管上显示按键按下的次数。 ● 外围电路:通过将按键连接到单片机的外部中断检测端口,实现中断产生电路,数码管显示电路用于指示
[单片机]
51单片机(十四)—— 中断功能介绍
中断是单片机的一个重要功能,本文我们就对51单片机的中断进行介绍。 所谓“中断”,通俗一点讲,就是单片机停止正在执行的任务,转去执行其它的急需解决的任务,当这个任务完成之后,在回到原来的任务继续执行。中断就是为了使单片机能够对外部或内部随机发生的事件进行实时处理而设计的。中断功能的存在,很多程度上提高了单片机处理外部或内部事件的能力。中断功能是我们在学习单片机过程中必须掌握的。 STC89C516单片机内部有6个中断源,也就是说,有6种情况发生时,会使单片机去处理中断程序。 为了能让大家更容易理解中断的概念,我们举一个通俗的例子:你打开火,烧一壶水,然后去扫地。在扫地过程中,突然听到水壶发出
[单片机]
51单片机(十四)—— <font color='red'>中断</font>功能介绍
如何利用stm32的中断和计数器即上升沿下降沿捕获电平时长
/*! @file ******************************************************************************** PRE 模块名 : 红外解码文件 文件名 : IR_REMOTE.c 相关文件 : IR_REMOTE.h 文件实现功能 : 定时器红外解码 作者 : 李 版本 : -------------------------------------------------------------------------------- 硬件平台 : STM32F107 软件开发平台 : iar --------
[单片机]
如何利用stm32的<font color='red'>中断</font>和计数器即上升沿下降沿捕获电平时长
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved