動作確認
ESP-WROOM-02
UDP通信でコマンドを受信して、そのコマンドの処理をしようとしている。
test.c
#include <stdio.h>
#include <stdlib.h> // for strtol
#include <string.h>
#include <stdint.h>
char rcvd[20];
int16_t readNumber(char *ptr)
{
if (ptr == NULL) {
return -1; // error
}
char *endptr;
int res;
res = (int)strtol(ptr, &endptr, /* base=*/10);
if (*endptr != '\0') {
return -1; // error
}
return res;
}
int16_t getAlertIdx(char *ptr)
{
if (ptr == NULL) {
return -1; // error
}
char *commaPtr;
commaPtr = strchr(ptr, ',');
printf("%s", ptr);
if (commaPtr == NULL) {
return -1; // error
}
commaPtr++;
// printf("found: %s", commaPtr);
return readNumber(commaPtr);
}
int main(void) {
strcpy(rcvd, "alert,aaa\r");
int16_t idx = getAlertIdx(rcvd);
printf("%d\n", idx);
return 0;
}
上記のコードはideoneでは問題なく動作する。
Aruduino IDEでESP8266に書き込み後実行した時に、正常な通信でも
if (*endptr != '\0') {
の条件にひっかかってしまう。
他の部分の間違いなのか分かっていない。
問題2
strtol()絡みか、以下のエラーもでる。
関数を自分で作るしかないかも。
Exception (2):
epc1=0x3ffe8410 epc2=0x00000000 epc3=0x00000000 excvaddr=0x3ffe8410 depc=0x00000000
ctx: cont
sp: 3ffef230 end: 3ffef4e0 offset: 01a0
>>>stack>>>
3ffef3d0: 64656233 65313931 34386431 00000037
3ffef3e0: fe84b100 202e783f fee9c440 100ffb3f
3ffef3f0: feeac040 feeab83f ffdc203f 0000003f
3ffef400: feea8400 202a393f fe84b040 0000003f
3ffef410: ffffff00 61ffffff 6d726574 3835392d
3ffef420: 2d376262 00000004 3ffef480 3ffef491
3ffef430: 40106e04 3ffee2d0 3ffee2d5 3fffdad0
3ffef440: 3ffee4b4 401051cf 00000a31 3ffe85f6
3ffef450: 3ffee484 00000000 00000000 3ffef3e0
3ffef460: 3ffee484 00000007 3ffe845f 3ffee4b4
3ffef470: 3ffef490 3ffef480 00000004 40202e89
3ffef480: 3ffe85f4 3ffee2d0 0000002c 3ffee2d8
3ffef490: 00000a31 0a312c74 3ffee484 4020335c
3ffef4a0: 402012e6 00000064 3ffee484 40201ab1
3ffef4b0: 3fffdad0 3ffee304 3ffee2d0 40201c53
3ffef4c0: feefeffe 00000000 3ffee4ac 40202fbc
3ffef4d0: feefeffe feefeffe 3ffee4c0 40100114
<<<stack<<<
おそらく問題の原因は..
What's the culprit? (原因は何か?)
電池電圧が2.9Vになっていた。
電池交換後は上記のエラーも出ないようだ。
こういう失敗はたまにする。
再発した。対策はwait?
int len = wifiUdp.read(receivedBuffer, 255);
の後ですぐにreceivedBufferの中身をパースしようとするとエラーが出る。
int len = wifiUdp.read(receivedBuffer, 255);
Serial.println();
とすると回避できるようだ。
read()の処理が終わっていないのかもしれない。
Serial.println();を実行することで処理時間に余裕が生まれException(2)がでなくなるように思う。
MSP430でもあったCPUの命令コードのプリフェッチ関連の問題なのだろうか?