Эскиз NodeMCU падает из-за «WiFi.localIP ();» - PullRequest
0 голосов
/ 18 января 2019

Мой код ранее работал, но сегодня, когда я запустил его, он начал падать, как только он запускается на устройстве. Я заметил, что серийный монитор напечатал IP Address: прямо перед сбоем, так что я заставил себя поиграть и выделить линию WiFi.localIP(); в качестве виновника аварии. Если я удаляю его, набросок запускается. Если я переместлю его до или после строк, которые печатаются на последовательном мониторе, я увижу эти напечатанные операторы до ошибки.

Ошибка трассировки:

.
IP Address: 
Exception (28):
epc1=0x4020a96c epc2=0x00000000 epc3=0x00000000 excvaddr=0x00004298 depc=0x00000000

ctx: cont 
sp: 3ffffd50 end: 3fffffd0 offset: 01a0

>>>stack>>>
3ffffef0:  20676e69 6f686353 fe006c6f feefeffe  
3fffff00:  69646f43 4e40676e 00545845 00000000  
3fffff10:  40104ab2 000032f3 00000100 00000003  
3fffff20:  3ffe8a98 00000000 3ffef798 00000003  
3fffff30:  3ffe8a98 3ffef728 3ffef798 40206a60  
3fffff40:  3ffe9060 3ffef798 3ffef728 40206949  
3fffff50:  00004298 3fffff80 3ffef728 40206cf0  
3fffff60:  c001a8c0 00ffffff 3ffef798 40206cd8  
3fffff70:  3fffdad0 3ffef728 3ffef798 40202eaa  
3fffff80:  40208160 c001a8c0 feefeffe feefeffe  
3fffff90:  feefeffe feefeffe feefeffe feefeffe  
3fffffa0:  feefeffe feefeffe feefeffe 3ffef858  
3fffffb0:  3fffdad0 00000000 3ffef852 4020781c  
3fffffc0:  feefeffe feefeffe 3ffe863c 40100739  
<<<stack<<<

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


 ets Jan  8 2013,rst cause:4, boot mode:(1,6)

wdt reset

Часть эскиза:

 #include <ESP8266WiFi.h>
#include <WebSocketsClient.h>
#include <ArduinoJson.h>
#include <EEPROM.h>

// Initialize pins
int redpin = D0;
int greenpin = D2;
int bluepin = D4;

//// Connecting to the internet
const char* ssid = "********";
const char* password = "********";

// Setting up the websocket client
WebSocketsClient webSocket;

// Set up the WiFi client;
WiFiClient client;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);

  pinMode(redpin, OUTPUT);
  pinMode(bluepin, OUTPUT);
  pinMode(greenpin, OUTPUT);


  delay(10);
  WiFi.begin(ssid, password);
  while(WiFi.status()!= WL_CONNECTED) {
    Serial.print(".");
    delay(500);  
  }
  Serial.println("");
  Serial.print("IP Address: ");
  Serial.print(WiFi.localIP() + "\n");
  Serial.print(WiFi.macAddress() + "\n");
}

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

1 Ответ

0 голосов
/ 18 января 2019

WiFi.localIP() возвращает IPAddress, а не String (см. Справочную страницу ). Вам нужно превратить его в String, прежде чем что-либо объединить с ним.

Так что вместо:

Serial.print(WiFi.localIP() + "\n");

Вам нужно

Serial.print(String(WiFi.localIP()) + "\n");

Еще лучше, используйте String.println(), избегайте конкатенации и String построение объекта:

Serial.println(WiFi.localIP());

Это работает, потому что существуют версии методов print() и println(), которые принимают IPAddress в качестве аргумента и знают, как преобразовать его в текст.

Аналогично, WiFi.macAddress() заполняет 6-байтовый массив, содержащий MAC-адрес интерфейса WiFi, и не возвращает String (см. Справочную страницу ). Вы не можете легко построить String из него, а методы print не будут знать, как с этим справиться.

Так что вместо:

Serial.print(WiFi.macAddress() + "\n");

Вам нужно будет сделать что-то вроде:

byte mac_address[6];

WiFi.macAddress(mac_address);
Serial.printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
               mac_address[0], mac_address[1], mac_address[2],
               mac_address[3], mac_address[4], mac_address[5]);
...