NodeMCU перезагружается при разборе строки с помощью Strtok () - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь написать код, который анализирует строку, полученную от инвертора, разделенную запятыми ",", и я использую strtok ().всякий раз, когда контроллер достигает конца процедуры синтаксического анализа, он вызывает исключение и перезагружает ESP8266.

Вот что получается, когда я запускаю последовательный монитор:


    .........Connected
    IP address: 192.168.0.103

    ESP8266_2512899799

    Connecting to broker mqtt.thingspeak.com

    MQTT Broker Connected

    Sending Command: ^P005GSX


    ^D1062521,498,2521,498,0756,0667,015,483,000,000,000,000,061,036,000,000,0000,0000,0000,0000,1,0,0,1,0,0,1,0⸮

    I am in updateNewData

    2521,498,2521,498,0756,0667,015,483,000,000,000,000,061,036,000,000,0000,0000,0000,0000,1,0,0,1,0,0,1,0

    V_grid (V): 2521
    0F_grid (Hz): 498
    1V_out (V): 2521
    2F_out (Hz): 498
    3KVA_out: 756
    4KW_out: 667
    5load_percentage: 15
    6V_bat (V): 483
    7V_bat_SCC (V): 0
    8V_bat_SCC2 (V): 0
    9bat_dis_cur (A): 0
    10bat_cha_cur (A): 0
    11bat_cap: 61
    12HS_temp: 36
    13MPPT1_temp: 0
    14MPPT2_temp: 0
    15PV1_watts: 0
    16PV2_watts: 0
    17V_PV1: 0
    18V_PV2: 0
    19s_val_conf_state: 1
    20MPPT1_status: 0
    21MPPT2_status: 0
    22load_status: 1
    23bat_pow_dir: 0
    24DCAC_pow_dir: 0
    25line_pow_dir: 1
    26power_direction: 0
    27
    Exception (28):
    epc1=0x40209912 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

    >>>stack>>>

    ctx: cont
    sp: 3ffffcf0 end: 3fffffc0 offset: 01a0
    3ffffe90:  00000000 00000001 3ffe8304 40203788  
    3ffffea0:  3fffff56 3ffee60a 3ffee990 0000001b  
    3ffffeb0:  3fffff56 0000001b 3ffee990 0000001b  
    3ffffec0:  00000000 3ffee60a 3ffee990 40209a74  
    3ffffed0:  3fffff56 3ffee60a 3ffee990 4020745c  
    3ffffee0:  3fffff56 3ffee60a 3ffee990 40201103  
    3ffffef0:  31323532 38393400 32353200 39340031  
    3fffff00:  37300038 30003635 00373636 00353130  
    3fffff10:  00333834 00303030 00303030 00303030  
    3fffff20:  00303030 00313630 00363330 00303030  
    3fffff30:  00303030 30303030 30303000 30300030  
    3fffff40:  30003030 00303030 00300031 00310030  
    3fffff50:  00300030 00300031 4010054c 40203a25  
    3fffff60:  0000001c 00000036 3ffee788 40203ab0  
    3fffff70:  3fffdad0 00000000 3ffee990 3ffeeab0  
    3fffff80:  3fffdad0 00000000 3ffee7a0 4020115e  
    3fffff90:  3fffdad0 00000000 3ffee82c 402013fe  
    3fffffa0:  3fffdad0 00000000 3ffeea80 402043d0  
    3fffffb0:  feefeffe feefeffe 3ffe8544 40100bcd  
    <<<stack<<<

     ets Jan  8 2013,rst cause:2, boot mode:(3,6)

    load 0x4010f000, len 1384, room 16 
    tail 8
    chksum 0x2d
    csum 0x2d
    v8b899c12
    ~ld
    Connecting to Freedom
    .....Connected
    IP address: 192.168.0.103
    ESP8266_6698254931
    Connecting to broker mqtt.thingspeak.com
    MQTT Broker Connected

Я запускаюДекодер исключений ESP, и он получает следующую трассировку стека:


    Exception 28: LoadProhibited: A load referenced a page mapped with an attribute that does not permit loads
    PC: 0x40209912: _strtol_r at /home/earle/src/esp-quick-toolchain/repo/newlib/newlib/libc/stdlib/strtol.c line 152
    EXCVADDR: 0x00000000

    Decoding stack results
    0x40203788: HardwareSerial::write(unsigned char const*, unsigned int) at C:\Users\usman hassan\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.2\cores\esp8266/HardwareSerial.h line 158
    0x40209a74: strtol at /home/earle/src/esp-quick-toolchain/repo/newlib/newlib/libc/stdlib/strtol.c line 224
    0x4020745c: atoi at /home/earle/src/esp-quick-toolchain/repo/newlib/newlib/libc/stdlib/atoi.c line 71
    0x40201103: parsedata() at C:\Users\usman hassan\Documents\Arduino\Infini Solar V  KW Monitor\Step_by_Step_connection/Step_by_Step_connection.ino line 137
    0x4010054c: millis() at C:\Users\usman hassan\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.2\cores\esp8266\core_esp8266_wiring.cpp line 186
    0x40203a25: Print::write(char const*) at C:\Users\usman hassan\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.2\cores\esp8266/Print.h line 60
    0x40203ab0: Print::println() at C:\Users\usman hassan\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.2\cores\esp8266\Print.cpp line 178
    0x4020115e: updateNewData() at C:\Users\usman hassan\Documents\Arduino\Infini Solar V  KW Monitor\Step_by_Step_connection/Step_by_Step_connection.ino line 149
    0x402013fe: loop() at C:\Users\usman hassan\Documents\Arduino\Infini Solar V  KW Monitor\Step_by_Step_connection/Step_by_Step_connection.ino line 254
    0x402043d0: loop_wrapper() at C:\Users\usman hassan\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.2\cores\esp8266\core_esp8266_main.cpp line 125

Я знаю так много, что это, вероятно, вызвано программой, пытающейся напечатать последнее значение NULL, но я не знаю, как это исправить.Я разработал код с использованием Arduino Uno, и тот же код работал просто отлично.я проверил программу без этой функции синтаксического анализа, и код просто работает на ESP8266, который говорит мне, что проблема заключается в этой функции.

Это моя функция, которая вызывает проблему:


    char receivedChars[] = "^D1062399,502,2399,502,1703,1673,034,482,000,000,000,000,060,038,000,000,0000,0000,0000,0000,0,0,0,1,0,0,1,0je";

    unsigned int para_var[29];

    void parsedata()
    {
      char* valPosition; 
      char temp1[103];
      int i = 0; 

      strncpy(temp1, &receivedChars[5],103);
      Serial.println(temp1);
      valPosition = strtok(temp1,",");
      para_var[i] = atoi(valPosition); 

      while (valPosition != NULL)
       {
          Serial.print(parameters[i]); 
          Serial.print(": "); 
          Serial.println(para_var[i]);
          Serial.print(i++); 
          valPosition = strtok(NULL, ",");
          para_var[i] = atoi(valPosition); 
       }
       Serial.println("I am in parseData");
    }

Я не программист, я просто учусь на ресурсах в сети и пытаюсь что-то создавать, и я не в курсе этого кода.Буду признателен за любую помощь, которую я могу получить.

Спасибо

PS: я использую следующие библиотеки

ESP8266WiFi.h
PubSubClient.h
SoftwareSerial.h
...