51单片机串口中断函数响应并返回后主函数运行到末尾后卡着不动,主函数无法循环了

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机串口中断函数响应并返回后主函数运行到末尾后卡着不动,主函数无法循环了相关的知识,希望对你有一定的参考价值。

程序如下:
void main(void)

LED_CHECK=1; //用来判断程序运行位置的LED灯,高电平灭。
Serial_Init(); //串口初始化函数
LCD_init(); //液晶屏初始化函数

if(acq||(!key)) //两种方式进入下面执行函数,acq(此为全局变量)由上位机串口设置启动,key为开发板上的按键启动。现在的问题是key启动没问题,程序可以再main函数内循环运行,但用PC机通过串口发生启动命令后,程序可以启动但运行到main函数底部后就不动了,无法循环,不知道是哪里的问题????

LCD_clear(2); //LCD清屏

pic_play(0,127,0,159); //显示图片
acq=0;


LED_CHECK=0; //用acq启动后运行到main函数的此位置,LED一直亮着


串口中断函数:
void ser_int (void) interrupt 4 using 1


LED_CHECK=1; //用acq启动后,主函数运行到底部也未把此处LED灯灭掉,说明未卡在中断函数中
if(RI == 1) //RI接受中断标志

RI = 0; //清除RI接受中断标志
ReData = SBUF;
if(ReData==97) //97为字符a的ascii

acq=1;

return;

有几个问题和楼主探讨一下:
1、main主程序中少一条while(1)或for(;;)的循环,运行后主程序应该是“跑飞”了;
2、中断返回貌似不需要加return;
3、串口初始化不知道时候正常,是否和上位机设置了1样的波特率;追问

你好,多谢你的回答!
1. 起初是有while(1)循环的,但是遇到同样的问题,所以我就把该语句删掉了。
2. 中断一般是不用return返回的,但据说可以加快回到主函数,删掉return还是遇到同样的问题。
3. 串口波特率设置是一样的,能够正常通信,上位机发送启动命令后能启动单片机,只是单片机只执行一次上位机的命令,第二次发控制命令就无效了,但单片机重新开机,用手动方式却可重复启动单片机。

追答

楼主,方便的话,你先将程序改成标准版的,就是带while(1)的,再将你的整个程序show出来吧,只有这一段,有些地方说不清楚的。

参考技术A 主函数缺少while(1)大循环,中断执行完了太容易跑飞了
另外你的ser_int()是中断接收函数,不是串口初始化函数。追问

Smart_wolf ,你好!
串口初始化函数一般应该放到主函数里面吧?应该初始化一次就行了啊,我的串口初始化函数是Serial_Init(); //串口初始化函数
如果是中断导致程序跑飞,那我通过LED_CHECK检查,执行完中断函数能够还回主函数啊,只是执行到主函数底部,就不动了,好像死机了一样。
另如果确实是程序跑飞了,有什么办法可以解决吗?,多谢了

追答

串口初始化函数一般就是放在主函数里面,只初始化一次,但是,串口初始化函数一般都不是中断函数,而是设定串口参数的,比如:
void uart_init(void)

SCON=0x50;
TMOD=0X20;
TH=TL=0X5d;
TR1=1;

但是你的串口初始化函数居然是一个处理串口接收中断的函数,我想不通,希望你能明白我的意思。
程序跑飞,原因很多,或硬件或软件,毕竟单片机程序是需要配合硬件设计来编写的,不同的硬件搭配对应的代码就不同,物理硬件中去掉一条导线或许都需要耗费大量的软件代码来弥补,所以想要系统解决你的问题,就得提供你的硬件原理图及程序代码。

参考技术B 你判断它不能循环的依据是什么?

编程实现stm32单片机串口的数据收发

参考技术A int main(void)

u16 t;
u16 len;
u16 times=0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
KEY_Init(); //初始化与按键连接的硬件接口
while(1)

if(USART_RX_STA&0x8000)

len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
printf("\r\n您发送的消息为:\r\n\r\n");
for(t=0;t<len;t++)

USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束

printf("\r\n\r\n");//插入换行
USART_RX_STA=0;


以上是关于51单片机串口中断函数响应并返回后主函数运行到末尾后卡着不动,主函数无法循环了的主要内容,如果未能解决你的问题,请参考以下文章

单片机c语言中interrupt4表示啥意思

细究STM32 HAL库的中断式串口接收

单片机的串口输入总是中断

单片机串口中断接收

PIC单片机串口接收进不了中断,发送正常

求51单片机中,用C语言写的五个中断源的中断函数的书写规则,就是进入中断函数时的那个函数名,并说明...