由于“ WiFi.localIP();“

时间:2019-01-18 08:24:52

标签: c++ arduino esp8266 nodemcu arduino-esp8266

我的代码以前可以运行,但是今天,当我运行它时,它在设备上运行后就开始崩溃。我注意到串行监视器在崩溃之前打印了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 :(得分:0)

WiFi.localIP()返回IPAddress,而不是String(请参见其reference page)。在将任何内容串联之前,需要将其变成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字节的数组,该数组包含WiFi接口的MAC地址,并且没有返回String(请参见其reference page)。您无法轻松地从中构造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]);