我的代码以前可以运行,但是今天,当我运行它时,它在设备上运行后就开始崩溃。我注意到串行监视器在崩溃之前打印了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地址即可运行我的草图,但是对于为什么它突然引发错误并想了解的原因,我感到很困惑。
答案 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]);