兔场恢复出厂设置BUG修复案例

xiaoxiao2025-08-11  15

一、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出现。

转载请注明原文地址: https://www.6miu.com/read-5034690.html

最新回复(0)