Exception NodeMCU在使用Strtok()解析字符串时重新启动
我正在尝试编写一个代码,解析从一个反相器接收的字符串,用逗号“,”分隔,我正在使用strtok()。每当控制器到达解析例程的末尾时,它都会引发异常并重新启动ESP8266 这是我运行串行监视器时得到的结果:Exception NodeMCU在使用Strtok()解析字符串时重新启动,exception,arduino,esp8266,strtok,nodemcu,Exception,Arduino,Esp8266,Strtok,Nodemcu,我正在尝试编写一个代码,解析从一个反相器接收的字符串,用逗号“,”分隔,我正在使用strtok()。每当控制器到达解析例程的末尾时,它都会引发异常并重新启动ESP8266 这是我运行串行监视器时得到的结果: .........Connected IP address: 192.168.0.103 ESP8266_2512899799 Connecting to broker mqtt.thingspeak.com MQTT Broker Conne
.........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
我知道这可能是由于程序试图打印最后一个空值造成的,但我不知道如何解决这个问题。我使用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
首先在atoi中使用valPosition,然后在while条件中测试它是否为NULL。do
para_var[i]=atoi(valPosition)代码>作为中的第一个,而哦,伙计,非常感谢你。这就解决了问题。非常感谢你花时间阅读这篇文章并帮助我。我永远无法解决这个问题。非常感谢你。
ESP8266WiFi.h
PubSubClient.h
SoftwareSerial.h