u8 region_default[8301] = {0};
//这两个变量为什么不能放在Display_parser里,一旦放入,只要进入该函数就会系统重启,即使定义成8192个字节,1024的整倍数也不行
u8 region_tempsave[8301] = {0};
void Displayer_parser()
{
......................................................
if(strstr(rev_buf, "$QYSC"))
//2014-09-17
{
memcpy(®ion_deletenums, rev_buf + 10, 1);
printf("region_deletenums is %d\r\n",region_deletenums);
if(region_deletenums == 100)
//本条指令携带的删除的区域的个数,1~100。当=100时,表示删除所有区域,区域编号字段不存在。
{
I2C_Write(I2C1, ADDR_24C02N, 237, region_default, 8301);
//程序功能无错,但是为什么还是不能超过1K字节,即使1个字节的写for循环8301次,也是会重启
memset(&LocalAreaData, 0, sizeof(AreaData));
memset(area_index, 0, 100);
}
else if((region_deletenums >= 1) && (region_deletenums < QYNUM))
//拟删除的区域的编号,1~100。
{
memcpy(region_delete, rev_buf + 11, region_deletenums);
I2C_Read(I2C1, ADDR_24C02N, 237, &area_nums, 1);
//从EEPROM里读取本地区域个数
for(i = 0; i < area_nums; i++)
{
I2C_Read(I2C1, ADDR_24C02N, 238 + i*83, &area_index[i], 1);
//从EEPROM里读取本地区域的各个编号
}
for(j = 0; j < region_deletenums; j++)
//如果在定位通信单元已经设置的区域中没有对应编号则忽略。
{
I2C_Read(I2C1, ADDR_24C02N, 237, &area_nums, 1);
for(m = 0; m < area_nums; m++)
{
I2C_Read(I2C1, ADDR_24C02N, 238 + m*83, &area_index[m], 1);
//从EEPROM里读取本地区域的各个编号
}
for(k = 0; k < area_nums; k++)
{
if(0 == memcmp(region_delete + j, area_index + k, 1))
{
I2C_Read(I2C1, ADDR_24C02N, 238 + (k+1)*83, region_tempsave, (area_nums - k - 1) * 83);
//保留之后的数据
I2C_Write(I2C1, ADDR_24C02N, 238 + k * 83, region_default, (area_nums - k) * 83);
//清零
I2C_Write(I2C1, ADDR_24C02N, 238 + k * 83, region_tempsave, (area_nums - k - 1) * 83);
// 将保留的数据赋到清零的位置
area_nums -= 1;
I2C_Write(I2C1, ADDR_24C02N, 237, &area_nums, 1);
//更新本地区域个数
I2C_Read(I2C1, ADDR_24C02N, 237, &area_nums, 1);
for(n = 0; n < area_nums; n++)
{
I2C_Read(I2C1, ADDR_24C02N, 238 + n*83, &area_index[n], 1);
//从EEPROM里读取本地区域的各个编号
}
break;
}
}
}
}
Display_QYXX();
return;
}
...............................................................
}