找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2017|回复: 9
收起左侧

新手求大神帮看看为什么单片机程序会卡死?

[复制链接]
ID:626079 发表于 2020-3-29 22:56 | 显示全部楼层 |阅读模式
本帖最后由 xmfjfhcel 于 2020-3-30 09:30 编辑


咨询高手大侠,下面这样作判断为什么程序会卡死呢?我是想判断一个状态如果连续出现错误50次,就认为设备有问题,如果这50次中哪怕有一次正确的值返回来也认为设备是好的,又从头开始计数判断。
感谢楼下的解答,我把程序改一下,昨晚没处理好,这样就清楚了,但是程序我观察了下,如果返回值为1了, errorchecknum增加了,程序就卡死了。errorchecknum是全局变量。
#include<reg52.h>
unsigned int errorchecknum=0;

unsigned char check()
{...............
               if(checkdata==data)
                 {
                      errorchecknum=0;
                       return 0;
                  }
               else
                 {
                     errorchecknum++;
                     return 1;
                 }
}



void main()
{.................
while(1)
          {         
                check();
                if(errorchecknum==50)
                {
                       //设备有问题
                 }
            }
}


回复

使用道具 举报

ID:282850 发表于 2020-3-30 01:14 | 显示全部楼层
unsigned char Dartcheck()
{
void check()
这种明显不对,删除unsigned char Dartcheck()
第3句改为 unsigned char check()就与return 1和while(1)中的调用对应了
回复

使用道具 举报

ID:235200 发表于 2020-3-30 01:27 | 显示全部楼层
errorchecknum是否是全程变量,另外判断errorchecknum==50,如果设备真有问题,这只是瞬间存在,所以这一句改为errorchecknum>50
回复

使用道具 举报

ID:709172 发表于 2020-3-30 02:36 | 显示全部楼层
首先你要确定errorchecknum是否定义为全局volatile易挥发变量,因为在循环判断errorchecknum值时,errorchecknum可能会取缓存值,不会更新,所以需要定义volatile unsigned uint8 errorchecknum。
其次将errorchecknum==50改为errorchecknum >50。
回复

使用道具 举报

ID:592807 发表于 2020-3-30 08:29 | 显示全部楼层
void check();是什么?第三行,被unsigned char Dartcheck()函数内构造函数?
回复

使用道具 举报

ID:626275 发表于 2020-3-30 08:55 | 显示全部楼层
是不是没有定义变量!然后冲突了
回复

使用道具 举报

ID:213173 发表于 2020-3-30 09:15 | 显示全部楼层
unsigned char errorchecknum;
bit Error;

void check()
{
        if(故障信息为真)
        {
                errorchecknum++;
                if(errorchecknum>=50)
                {
                        errorchecknum=50;
                        Error=1;
                }
        }
        else errorchecknum==0;
}

void main()
{
        while(1)
        {         
                check();
                if(Error)//设备有问题
                {                       
                        //处理故障
                        if(故障排除)
                        {
                                Error=0;
                                errorchecknum=0;
                        }
                }
        }
}
回复

使用道具 举报

ID:626079 发表于 2020-3-30 09:52 | 显示全部楼层
文心雕龙7 发表于 2020-3-30 02:36
首先你要确定errorchecknum是否定义为全局volatile易挥发变量,因为在循环判断errorchecknum值时,errorche ...

嗯,好的,谢谢提醒,我试试定义为volatile看看
回复

使用道具 举报

ID:626079 发表于 2020-3-30 10:00 | 显示全部楼层
因为程序在一开始就卡死了, 怀疑在errrochecknum=1的时候程序就锁死了…………如果程序取消对errrochecknum的判断,就正常运行没有问题。

这个问题想了几天都没有想明白。
回复

使用道具 举报

ID:626079 发表于 2020-3-30 10:32 | 显示全部楼层
wulin 发表于 2020-3-30 09:15
unsigned char errorchecknum;
bit Error;

感谢, 回头按你这个思路改一下看看。
因为现在设备是好的,errorchecknum肯定是到不了50,之前关键是一到errorchecknum=1就死掉了。 当有错误数据传第一次传过来,程序就卡死…………感觉就是errorchecknum在赋值为1后,下次来一个正确的数据,errochecknum又该赋值为0,这时时候就卡住了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表