一、BUG问题描述
在兔场网关代码中,恢复出厂设置的BUG问题是阶段化的。在下面的两个网关状态阶段进行恢复出厂设置会导致恢复出厂失败,其他阶段进行恢复出厂设置均正常。
正常恢复出厂设置通过串口打印得到的数据:(多余的打印数据已经略去)
存储节点个数为0?——进行按键恢复出厂设置
波特率设置完成
频段为8
OK
00000003
读取节点个数为0
Gwsta_init_toAP
at+netmode=3
ok
at+wifi_conf=shannondatagateway,wpa2_aes,shannon01
ok
at+dhcpd=1
ok
at+dhcpd_ip=192.168.16.100,192.168.16.200,255.255.255.0,192.168.16.254
ok
at+dhcpd_dns=192.168.16.254,8.8.8.8
ok
at+dhcpd_time=86400
ok
at+net_ip=192.168.16.254,255.255.255.0,192.168.16.254
ok
at+net_dns=192.168.16.254,8.8.8.8
ok
at+remoteip=192.168.87.59
ok
at+remoteport=5000
ok
at+remotepro=tcp
ok
at+timeout=0
ok
at+mode=server
ok
at+uart=115200,8,n,1
ok
at+uartpacklen=64
ok
at+uartpacktimeout=10
ok
at+net_commit=1
at+reconn=1
第一阶段接收完毕
ok
第二阶段接收完毕
AP模式配置成功
Gwsta_init_cntoPhone
at+netmode=2
at+wifi_conf=HUAWEI-WS138,wpa2_aes,9876543210.
at+dhcpc=1
at+remoteip=192.168.87.59
at+remoteport=8080
at+remotepro=udp
at+timeout=0
at+mode=client
at+uart=115200,8,n,1
at+uartpacklen=500
at+uartpacktimeout=10
at+net_commit=1
at+reconn=1
成功接收手机数据
客户端模式配置数据接收成功
(1)在配置AP模式和配置客户端模式,RM04运行返回数据阶段进时行按键恢复出厂设置,通过串口打印得到以下数据:(多余的打印数据已经略去,请仔细对比正确数据)
at+net_commit=1
存储节点个数为0?——进行按键恢复出厂设置
波特率设置完成
频段为8
OK
00000003
读取节点个数为0
Gwsta_init_toAP
at+reconn=1
第一阶段接收完毕
ok
第二阶段接收完毕
AP模式配置成功
at+netmode=3
ok
at+wifi_conf=shannondatagateway,wpa2_aes,shannon01
ok
at+dhcpd=1
ok
at+dhcpd_ip=192.168.16.100,192.168.16.200,255.255.255.0,192.168.16.254
ok
at+dhcpd_dns=192.168.16.254,8.8.8.8
ok
at+dhcpd_time=86400
ok
at+net_ip=192.168.16.254,255.255.255.0,192.168.16.254
ok
at+net_dns=192.168.16.254,8.8.8.8
ok
at+remoteip=192.168.11.245
ok
at+remoteport=5000
ok
at+remotepro=tcp
ok
at+timeout=0
ok
at+mode=server
ok
at+uart=115200,8,n,1
ok
at+uartpacklen=64
ok
at+uartpacktimeout=10
ok
at+net_commit=1
at+reconn=1
成功接收手机数据
客户端模式配置数据接收成功
分析:在RM04运行返回的过程中进行恢复出厂设置,在程序重启后,RM04还是继续返回恢复出厂设置前没有返回完的数据,造成AP模式并没有接收到配置文件就直接跳过,进入到了Gwsta_init_cntoPhone状态,随后才会接收到配置AP模式的配置文件,又因为跳出AP模式和Gwsta_init_cntoPhone状态的判断字符相同都是"conn=1",所以当接收到AP模式的配置文件里的”at+reconn=1”后,就跳出了Gwsta_init_cntoPhone状态。但是事实上RM04并没有接收到手机发过来的数据信息。
(2)在网关状态为Gwsta_run_ok阶段进行恢复出厂设置,通过串口打印得到以下数据:(多余的打印数据已经略去,请仔细对比正确数据)
Gwsta_run_ok
10月21日21时46分0秒
存储节点个数为0?——进行按键恢复出厂设置
波特率设置完成
频段为8
OK
00000003
读取节点个数为0
Gwsta_init_toAP
第一阶段接收完毕
第二阶段接收完毕
AP模式配置成功
at+netmode=3
ok
at+wifi_conf=shannondatagateway,wpa2_aes,shannon01
ok
at+dhcpd=1
ok
at+dhcpd_ip=192.168.16.100,192.168.16.200,255.255.255.0,192.168.16.254
ok
at+dhcpd_dns=192.168.16.254,8.8.8.8
ok
at+dhcpd_time=86400
ok
at+net_ip=192.168.16.254,255.255.255.0,192.168.16.254
ok
at+net_dns=192.168.16.254,8.8.8.8
ok
at+remoteip=192.168.11.245
ok
at+remoteport=5000
ok
at+remotepro=tcp
ok
at+timeout=0
ok
at+mode=server
ok
at+uart=115200,8,n,1
ok
at+uartpacklen=64
ok
at+uartpacktimeout=10
ok
at+net_commit=1
at+reconn=1
成功接收手机数据
客户端模式配置数据接收成功
分析:在Gwsta_run_ok状态进行恢复出厂设置,在程序重启后,串式并没有接收到配置文件就直接跳过,进入到了Gwsta_init_cntoPhone状态,随后才会接收到配置AP模式的配置文件,又因为跳出AP模式和Gwsta_init_cntoPhone状态的判断字符相同都是"conn=1",所以当接收到AP模式的配置文件里的”at+reconn=1”后,就跳出了Gwsta_init_cntoPhone状态。但是事实上RM04并没有接收到手机发过来的数据信息。
BUG问题总结:恢复出厂设置出现的BUG的原因都是因为在网关进行软件复位后,RM04还在继续工作,所以应该让RM04和网关软件一起恢复出厂应该就能解决这个BUG。
代码分析修改原代码: (部分重要代码)
//******按键5s开始恢复出厂设置 ******//
if(Timer_sec==5)
{
Timer_sec=0;
if(RESET_Key)
{
Tim_RESET++;
if(Tim_RESET>=5)
{
Tim_RESET=0;
Gw_station=Gwsta_init_toAP;
read_COM_RM10_data_cp=COM_RM10_data_cp=0;
Message_Header_data.Nodecount_amount=0;
EEPROM_Memory(Message_Header_data.GWID,Gw_station,Message_Header_data.Nodecount_amount);
SCB->AIRCR = AIRCR_VECTKEY_MASK | (u32)0x04; //软件复位
}
//******恢复出厂设置后配置AP模式*****//
switch(Gw_station)
{
case Gwsta_init_toAP:
Delay_S(1);
usart2_sendbyte('0');
printf("\r\nGwsta_init_toAP\r\n");
RM10_RST();
RM10_AT();
usart2_sendstring(commands_wifi_ap,490);
Delay_S(30);
break;
}
在原代码中可以看到恢复出厂设置是先将网关软件复位后,经过“一段时间”才把RM04恢复出厂的,当然这“一段时间”还要包括网关各个引脚、定时器等等的初始化。就在这“一段时间”过程中,RM04开始捣乱了。所以,应该将RM04的恢复出厂设置和软件的复位同时进行。
修改代码: (红色为修改部分)
//******按键5s开始恢复出厂设置 ******//
if(Timer_sec==5)
{
Timer_sec=0;
if(RESET_Key)
{
Tim_RESET++;
if(Tim_RESET>=5)
{
Tim_RESET=0;
Gw_station=Gwsta_init_toAP;
read_COM_RM10_data_cp=COM_RM10_data_cp=0;
Message_Header_data.Nodecount_amount=0;
EEPROM_Memory(Message_Header_data.GWID,Gw_station,Message_Header_data.Nodecount_amount);
RM10_RST();
RM10_AT();
SCB->AIRCR = AIRCR_VECTKEY_MASK | (u32)0x04; //软件复位
}
//******恢复出厂设置后配置AP模式*****//
switch(Gw_station)
{
case Gwsta_init_toAP:
Delay_S(1);
usart2_sendbyte('0');
printf("\r\nGwsta_init_toAP\r\n");
usart2_sendstring(commands_wifi_ap,490);
Delay_S(30);
break;
结果:修改后测试多次没有BUG出现。