本帖最后由 jishuaihu 于 2016-3-21 10:17 编辑
- for(i = 0; i< SENSORNUM ;i++)
- {
- if(Lost[i] < 24)
- {
- Lost[i] ++;
-
- }
- else
- {
- SensorCode[i][0] = 0;
- SensorCode[i][1] = 0;
- SensorCode[i][2] = 0;
- SensorCode[i][3] = 0;
- SensorCode[i][4] = 0;
- SensorCode[i][5] = 0;
-
- SensorData[i].Tem = 0;
- SensorData[i].Hum = 0;
- SensorData[i].Bat = 0;
- SensorData[i].RSSI = 0;
- }
- }
复制代码最近写了一个程序,里面有上面这样一段代码,作用是当某一个条件不满足时进行计数,达到指定次数后把另外的一组数清零。按照我的思路,lost
数组里的数不会大于24,可是仿真的时候经常发现lost里面有很大的数,而且明显技术的时间还没有到呢。比如设备复位后,在初始化完成后设断点,此时看lost数组里面的数还都是0,接下来在lsot++处设置断点,全速运行到断点处的时候lsot数组里面有一些数就已经不是0了。而且是很大的数。
大家有没有遇到过类似的情况?或者给想 想有没有其他的可能~!
第一次运行到断点处的样子
谢谢
此帖出自
小平头技术问答
Lost[]下边的数组溢出?
对,上边,我说错了。
其它地方对Lost[]做处理了吗?
其他的地方就一个清零。
我大概知道上面原因了。我对另外的一个数组复制的时候没有判断数组标号,应该是那儿的问题,我加一个判断试试啊。
谢谢
搞定了,谢谢
littleshrimp说的对,是其他的数组越限了
我说一下是的应用,给大家提供一些教训。
我做的是一个无线接收模块的数据处理终端,无线模块接收到的数据会以串口的形式发送给我的单片机。单片机接收到后进行处理。我一开始代码是这样的。这个是串口中断里面的一部分代码。
- Temp = USART_ReceiveData(USART3);
-
-
- if(RevIndex == 0)
- {
- GroupID = Temp;
- }
- else if(RevIndex == 1)
- {
- DeviceID = Temp - 1;
- }
- else
- {
- SensorCode[DeviceID][RevIndex - 2] = Temp;
-
- }
复制代码 问题的关键在于SensorCode[DeviceID][RevIndex - 2] = Temp;这一句里面没有判断DeviceID的范围是否越限。这样的话编译的时候是没有越限的,不会提示警告,而实际运行的时候DeviceID收到的数如果是错误的话,就可能导致SensorCode越限。结果赶巧了是到lost数组。找到问题后我把代码修改为下面的结果。
- Temp = USART_ReceiveData(USART3);
-
-
- if(RevIndex == 0)
- {
- GroupID = Temp;
- }
- else if(RevIndex == 1)
- {
- if((Temp>0)&&(Temp < (SENSORNUM +1)))
- {
- DeviceID = Temp - 1;
- }
- else
- {
- DeviceID = 0xFF;
- }
- }
- else
- {
- if(DeviceID < SENSORNUM)
- {
- SensorCode[DeviceID][RevIndex - 2] = Temp;
- }
- else
- {
- //数据丢掉,不作处理
- }
- }
复制代码 在两个地方对DeviceID进行了判断。接收和使用的时候都加了判断,如果发现DeviceID数据异常,则直接丢弃这一包数据。避免最开始的情况。大家也帮忙看看修改后的代码有没有问题没有,
此贴到此也算是结贴了吧。从提出问题到现在基本半个小时
一周热门 更多>