如此简单的程序为什么会进入死循环
釆用IAP15W4K58S4单片机截取并口打印机程序,偶尔会走不出以下程序.真是奇怪了.Printer_STB是数据使能脚 ,取得数据送入da_ta[]数据组,i是全局变量,0X08是整个数据的最后一位.检测到此数据跳出此函数.
void printer_data(void)
{
while(1) //接收数据
{
while(Printer_STB); //等待
while(Printer_STB); //等待
//while(!Printer_STB); //判断读数据信号
da_ta = P2; //printer数据进入内存
if(da_ta==0x08)break;//检查到0D(回车)跳出些循环
i++;
while(!Printer_STB); //等待Printer_STB低谷过去,防止重复发一个数据
}
i=0;
_nop_();
_nop_();
} 本帖最后由 LcwSwust 于 2020-11-18 10:25 编辑
1.i++;未加限制可能引起溢出。
2.若软件确定没问题,检查下硬件。
3.Printer_STB接外中断可能更方便。
LcwSwust 发表于 2020-11-18 10:23
1.i++;未加限制可能引起溢出。
2.若软件确定没问题,检查下硬件。
我们想到一起了,但是感觉即使是溢出,多次发送数据也应试能退出此程序,事实是无法退出此程序. 本帖最后由 LcwSwust 于 2020-11-18 10:42 编辑
集成 发表于 2020-11-18 10:26
我们想到一起了,但是感觉即使是溢出,多次发送数据也应试能退出此程序,事实是无法退出此程序. ...
i若是太大,da_ta [ i ] 写数组可能越界,可能引起死机或其它奇怪问题。
若未越界,建议在这函数里每一条语句后添一句,向串口发送不同的字符,这样就能看出它死在了哪里。
这种到处死等的程序会有隐患,如果等待的信号没来,就一直在哪里等,就死翘翘了。
我一般用中断或if来处理,八正程序中,没有地方有死等的情况,几十有,也会有超时退出机制,并且等待时间会很短。 LcwSwust 发表于 2020-11-18 10:38
i若是太大,da_ta [ i ] 写数组可能越界,可能引起死机或其它奇怪问题。
若未越界,建议在这函数里每一条 ...
不能写太多的指令,指令多了就无法正常读取数据了,上位机发出的数据是给打印机的,这个单片机是被动的读取打印机数据.是不打印机并联的. coody 发表于 2020-11-18 11:46
这种到处死等的程序会有隐患,如果等待的信号没来,就一直在哪里等,就死翘翘了。
我一般用中断或if来处理 ...
也想用中断来读取数据,考虑中断比较慢,就没有用.有时间了试试中断.因为数据量比较大,数组变量在扩展RAM里.数据传递慢
现在的情况是数据未来就死那里了,数据来了就不会读取并退出此函数了
死机是偶尔发生但这就不稳定了,有时候**座会发现死机的情况 “这种到处死等的程序会有隐患,如果等待的信号没来,就一直在哪里等,就死翘翘了。”
这个正解,有经验的不会这么多等待的,程序太容易死了,给它一定的等待时间,不要太大,这样就变成快速扫描捕捉模式,而不是死死的在那等。。。 死等待本来就很容易死掉的,再加上可能的数组越界,彻底死掉。 本帖最后由 zlf1208 于 2020-11-22 11:23 编辑
1. 任何一条while语句都要高度警觉,极易引起死机,所以在while循环中尽可能加入退出循环的机制;
2. 尽可能避免使用没有可靠推出条件的while语句;
3. while语句独占CPU,所以效率非常低;
4. 凡是数组的下标,一定要防止上下越界,不能让下标任性胡为
页:
[1]