LoginSignup
1

More than 5 years have passed since last update.

ESP8266 > strtol()のバグ? > wifiUdp.read()のバグ? > waitで対策

Last updated at Posted at 2016-01-30
動作確認
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の命令コードのプリフェッチ関連の問題なのだろうか?

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1