本帖最后由 jishuaihu 于 2016-3-21 10:39 编辑
搞定了,谢谢
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数据异常,则直接丢弃这一包数据。避免最开始的情况。
大家也帮忙看看修改后的代码有没有问题没有,
此贴到此也算是结贴了吧。从提出问题到现在基本半个小时
|