打印
[STC单片机]

如此简单的程序为什么会进入死循环

[复制链接]
618|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
集成|  楼主 | 2020-11-18 10:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
釆用IAP15W4K58S4单片机截取并口打印机程序,偶尔会走不出以下程序.真是奇怪了.
Printer_STB是数据使能脚 ,取得数据送入da_ta[]数据组,i是全局变量,0X08是整个数据的最后一位.检测到此数据跳出此函数.

void printer_data(void)
{
         while(1)                                                                        //接收数据
        {
                while(Printer_STB);    //等待
                while(Printer_STB);    //等待
                //while(!Printer_STB);        //判断读数据信号
                da_ta[i] = P2;        //printer数据进入内存
               
                if(da_ta[i]==0x08)break;  //检查到0D(回车)跳出些循环
                i++;
                while(!Printer_STB);   //等待Printer_STB低谷过去,防止重复发一个数据
  }
       
        i=0;

        _nop_();
        _nop_();
}

使用特权

评论回复

相关帖子

沙发
LcwSwust| | 2020-11-18 10:23 | 只看该作者
本帖最后由 LcwSwust 于 2020-11-18 10:25 编辑

1.i++;未加限制可能引起溢出。
2.若软件确定没问题,检查下硬件。
3.Printer_STB接外中断可能更方便。

使用特权

评论回复
板凳
集成|  楼主 | 2020-11-18 10:26 | 只看该作者
LcwSwust 发表于 2020-11-18 10:23
1.i++;未加限制可能引起溢出。
2.若软件确定没问题,检查下硬件。

我们想到一起了,但是感觉即使是溢出,多次发送数据也应试能退出此程序,事实是无法退出此程序.

使用特权

评论回复
地板
LcwSwust| | 2020-11-18 10:38 | 只看该作者
本帖最后由 LcwSwust 于 2020-11-18 10:42 编辑
集成 发表于 2020-11-18 10:26
我们想到一起了,但是感觉即使是溢出,多次发送数据也应试能退出此程序,事实是无法退出此程序. ...

i若是太大,da_ta [ i ] 写数组可能越界,可能引起死机或其它奇怪问题。
若未越界,建议在这函数里每一条语句后添一句,向串口发送不同的字符,这样就能看出它死在了哪里。

使用特权

评论回复
评论
谭翬 2020-11-20 11:00 回复TA
分析有道理 
5
coody| | 2020-11-18 11:46 | 只看该作者
这种到处死等的程序会有隐患,如果等待的信号没来,就一直在哪里等,就死翘翘了。
我一般用中断或if来处理,八正程序中,没有地方有死等的情况,几十有,也会有超时退出机制,并且等待时间会很短。

使用特权

评论回复
6
集成|  楼主 | 2020-11-18 12:11 | 只看该作者
LcwSwust 发表于 2020-11-18 10:38
i若是太大,da_ta [ i ] 写数组可能越界,可能引起死机或其它奇怪问题。
若未越界,建议在这函数里每一条 ...

不能写太多的指令,指令多了就无法正常读取数据了,上位机发出的数据是给打印机的,这个单片机是被动的读取打印机数据.是不打印机并联的.

使用特权

评论回复
7
集成|  楼主 | 2020-11-18 12:14 | 只看该作者
coody 发表于 2020-11-18 11:46
这种到处死等的程序会有隐患,如果等待的信号没来,就一直在哪里等,就死翘翘了。
我一般用中断或if来处理 ...

也想用中断来读取数据,考虑中断比较慢,就没有用.有时间了试试中断.因为数据量比较大,数组变量在扩展RAM里.数据传递慢

使用特权

评论回复
8
集成|  楼主 | 2020-11-18 12:16 | 只看该作者
现在的情况是数据未来就死那里了,数据来了就不会读取并退出此函数了

使用特权

评论回复
9
集成|  楼主 | 2020-11-18 12:17 | 只看该作者
死机是偶尔发生但这就不稳定了,有时候**座会发现死机的情况

使用特权

评论回复
10
henangongda123| | 2020-11-18 17:54 | 只看该作者
“这种到处死等的程序会有隐患,如果等待的信号没来,就一直在哪里等,就死翘翘了。”
这个正解,有经验的不会这么多等待的,程序太容易死了,给它一定的等待时间,不要太大,这样就变成快速扫描捕捉模式,而不是死死的在那等。。。

使用特权

评论回复
11
xyz549040622| | 2020-11-20 22:41 | 只看该作者
死等待本来就很容易死掉的,再加上可能的数组越界,彻底死掉。

使用特权

评论回复
12
zlf1208| | 2020-11-22 11:20 | 只看该作者
本帖最后由 zlf1208 于 2020-11-22 11:23 编辑

1. 任何一条while语句都要高度警觉,极易引起死机,所以在while循环中尽可能加入退出循环的机制;
2. 尽可能避免使用没有可靠推出条件的while语句;
3. while语句独占CPU,所以效率非常低;
4. 凡是数组的下标,一定要防止上下越界,不能让下标任性胡为

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

135

帖子

1

粉丝