初级会员
- 积分
- 149
- 金钱
- 149
- 注册时间
- 2013-7-31
- 在线时间
- 0 小时
|
楼主 |
发表于 2014-3-16 09:03:11
|
显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥太牛了!一下子就看到问题了。的确是数组有问题,但是我搞不清楚我怎么数组访问越界的?
首先我定义了2个数组
u16 DATA[40];
u16 DATA_buf[40];
然后通过串口传输数据的第一位确定数组的下标
Decice_ID=USART3_RX_BUF[0];
Decice_ID=Decice_ID%39; //为了防止越界取余
DATA_buf[Decice_ID]=DATA[Decice_ID];
后面全部调用的DATA_buf[Decice_ID]和DATA[Decice_ID]了
当我把DATA_buf[Decice_ID]和DATA[Decice_ID]用DATA_buf和DATA替换了,程序又正常了。
主程序代码
int main(void)
{
u16 t;
u16 DATA[40]; //缓存zigbee串口数据
u16 DATA_buf[40]; //二级缓存zigbee串口数据
u8 Decice_ID=0;
//产生警报提示语
u8 WLW[21]="Device0 Water Level ";
u8 CLW[21]="Device0 Covers Loss ";
u8 COW[23]="Device0 CH4 Overproof ";
u8 WL_CLW[47]="Device0 Water Level Overproof and Covers Loss ";
u8 CO_CLW[39]="Device0 Covers Loss and CH4 Overproof ";
u8 WL_COW[49]="Device0 Water Level Overproof and CH4 Overproof ";
u8 WL_CL_COW[63]="Device0 Water Level Overproof , Covers Loss and CH4 Overproof ";
u16 len; //串口传送信息长度
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,115200); //串口1初始化
LCD_Init(); //初始化液晶
LED_Init(); //LED初始化
KEY_Init(); //按键初始化
USART2_Init(36,115200); //初始化串口2
delay_ms(200);
uart3_init(36,115200); //串口3初始化
mem_init(SRAMIN); //初始化内部内存池
exfuns_init(); //为fatfs相关变量申请内存
TP_Init(); //触摸屏初始化
Custom_GUI();
while(1)
{
if(USART3_RX_STA&0x8000)
{
len=USART3_RX_STA&0x3FFF; //得到此次接收到的数据长度
for(t=0;t<len;t++)
{
USART3->DR=USART3_RX_BUF[t];
LCD_ShowChar(8*t,0,USART3_RX_BUF[t]+48,16,0);
while((USART3->SR&0X40)==0); //等待发送结束
}
USART3_RX_STA=0;
LCD_ShowxNum(200,0,USART3_RX_BUF[0],8,16,0);
Decice_ID=USART3_RX_BUF[0];
Decice_ID=Decice_ID%39;
DATA_buf[Decice_ID]=DATA[Decice_ID];
DATA[Decice_ID]=(USART3_RX_BUF[1])*0x4000+(USART3_RX_BUF[2])*0x2000+(USART3_RX_BUF[3])*0x1000;
//整合数据在16为数据中高四位存储传感器信息,低12位存储终端编码
if((DATA_buf[Decice_ID]!=DATA[Decice_ID]) && \
DATA_buf[Decice_ID]!=0)//数据发生改变,发送短信通知
{
switch(DATA[Decice_ID]&0xF000)
{
case 0x3000:WLW[6]=USART3_RX_BUF[0];sim900a_test_msg=WLW;sim900a_sms();break;
case 0x5000:CLW[6]=USART3_RX_BUF[0];sim900a_test_msg=CLW;sim900a_sms();break;
case 0x6000:COW[6]=USART3_RX_BUF[0];sim900a_test_msg=COW;sim900a_sms();break;
case 0x1000:WL_CLW[6]=USART3_RX_BUF[0];sim900a_test_msg=WL_CLW;sim900a_sms();break;
case 0x4000:CO_CLW[6]=USART3_RX_BUF[0];sim900a_test_msg=CO_CLW;sim900a_sms();break;
case 0x2000:WL_COW[6]=USART3_RX_BUF[0];sim900a_test_msg=WL_COW;sim900a_sms();break;
case 0x0000:WL_CL_COW[6]=USART3_RX_BUF[0];sim900a_test_msg=WL_CL_COW;
sim900a_sms();break;
default: break;
}
}
delay_ms(10);
Custom_GUI_fresh(DATA[Decice_ID]); //更新GUI显示状态
}
if(KEY2==0)
{
delay_ms(10);
if(KEY2==0)
{
LCD_LED=!LCD_LED; //背光控制
while(KEY2==0);
}
}
tp_dev.scan(0);
if(tp_dev.sta&TP_PRES_DOWN) //触摸屏被按下 tp_dev.x为x值tp_dev.y为y值
{
if(tp_dev.x<lcddev.width&&tp_dev.y><lcddev.height)
{
if(tp_dev.x>240&&tp_dev.x<290&&tp_dev.y>194&&tp_dev.y<214)
Page++;
if(tp_dev.x>25&&tp_dev.x<75&&tp_dev.y>194&&tp_dev.y<214&&Page>0)
Page--;
}
Custom_GUI();
while(PEN==0);
}
}
} |
|