|
在中断中最好不要使用while 也不要在中断调用延时时间过长的函数 |
goodshot 发表于 2022-12-7 10:05 不知道你的ledFlash()函数的具体代码,但放在串口中断中运行肯定是不当的,LED闪烁是需要在一定的时间范围完成,而串口中断函数是不能把占用较长时间的LED闪烁函数放进去。串口中断只能根据收到的信息经判断输出一个标志并立即退出函数。主函数根据这个标志调用指定的子函数。 void Usart() interrupt 4 { unsigned char receiveData; receiveData=SBUF;//获取接收到的数据 RI = 0;//清除接收中断标志位 if(receiveData==0x01)//判断是真 { flag=1;//标志置1 } else { flag=0;//标志清0 } } 如果主函数中要持续执行 if(flag) { ledFlash(); } 如果主函数中只要执行1次 if(flag) { flag=0; ledFlash(); } |
1261867136qq 发表于 2022-12-6 08:37 完整代码如下:
代码可以执行,led闪烁, 但是,出现了2个问题: 1.小灯一直闪烁,停不下来了 2.采用while提前,又不执行了
不知道这是怎么回事 |
C:\Users\DELL\Pictures\3.png 这个可以执行,不知道为什么? 但是同时出现了2个问题: 1.是ledFlash()函数只让led闪烁3次,但是在这个函数执行过程中,小灯却一直闪烁,退不出来了,这是为什么? 2.是while语句放在前面,{}中的flashLed()又不执行了,这个真不懂了 C:\Users\DELL\Pictures\4.png 求教 |
wulin 发表于 2022-12-6 07:27 你好,抱歉,没大看明白,能否解释一下呢 另外,说一下项目的情况,我是想实现双机通信,另外一个设备通过串口发送信息,这台设备通过出口得到信息后进行动作(现在使用的ledFlash()就是这个简单效果,这个函数在主函数跑以及在没有if判断的这个串行接收中断函数中跑,都正常使得外部led闪烁,但是放到if语句就不执行了,感觉 if 语句中的布尔逻辑是TRUE,不知为什么) |
|
我严重怀疑,你是串口调试助手使用问题,可能选择了ASCII发送(这种情况下,单片机永远收不到0x01)。 应该切换到十六进制发送。 |
| 代码不全,这类处理最好是放在主程序处理,而不是在中断里处理 |
|
if(receiveData==0x01) { ledFlash(); } 放到 while(!TI); //等待发送数据完成里面呢? |
| 问题当然在出在ledFlash()函数。放在串口中断里,每发生一次中断,if判断真后 ledFlash()函数只执行一次。放在主循环中就不同了,if判断真后只要receiveData没有变化, ledFlash()函数永久重复执行。 |
| 顶一下 |
northroom 发表于 2022-12-5 12:00 连续发了,还是不行 |
| 连续发了,不闪烁 |
| 和楼上观点一样:连续发 0x01,看是否闪烁。 |
| 连续发 0x01 看看是否能闪烁 |