我已将Firebase代码上载到NodeMCU(esp8266)中并具有完整功能。我已使用Rx,Tx引脚将arduino uno与nodemcu连接。当我从传感器获取值并将其传输到nodeMCU时。我得到一半的垃圾值和一半的正确值。垃圾的长度在不断变化,我一次获得了完美的价值,而另一遍却充满了垃圾。
我尝试更改波特率,但没有成功。我遇到了nodeMCU和arduino的两种不同的波特率。
SoftwareSerial ESP(0,1);
void setup() {
ESP.begin(9600);
}
void sendStatus(bool dish, byte gas, int knob, unsigned long alarmIn) {
DynamicJsonDocument status(50);
status["K"] = knob;
status["G"] = gas;
status["D"] = dish;
status["A"] = alarmIn;
String statusString;
serializeJson(status, statusString);
Serial.println(statusString);
ESP.println(statusString);
}
void readSerial() {
if (!ESP.available()) return;
String cmd = "";
while (ESP.available()) {
char ch = (char)ESP.read();
if (ch != 10 && ch != 13) cmd += ch;
if (ch == '}')
break;
delay(1);
}
while (ESP.available()) {
ESP.read();
delay(1);
} // for arduino uno
我希望得到完整的字符串,但是我得到字符串的最后50-70%,而第一部分则成为垃圾值。需要获取我可以在arduino的串行监视器中看到的完整字符串。
答案 0 :(得分:1)
我看不到您的代码有什么大问题,但似乎您遇到了内存问题或串行通信有问题,所以我给您一些提示,也许可以帮忙:
首先,在sendStatus
函数中,确保DynamicJsonDocument status(50);
足够大以容纳您的值,尤其是在添加大数的情况下。
也根据docs:
您可以选择将JsonDocument存储在堆栈中或堆中:
使用StaticJsonDocument存储在堆栈中(建议用于 小于1KB的文件)
使用DynamicJsonDocument将其存储在 堆(建议用于大于1KB的文档)
因此,我认为将StaticJsonDocument
用作带有JsonObject
的全局变量是一个更好的选择,因为您的Json对象不是太大,并且具有静态键。
第二,对于readSerial
,我建议您使用像readString
这样的简单函数,而不要延迟读取字节。
SoftwareSerial ESP(0, 1);
StaticJsonDocument<100> status;
JsonObject object;
void setup()
{
ESP.begin(9600);
Serial.begin(9600);
object = status.to<JsonObject>();
}
void sendStatus(bool dish, byte gas, int knob, unsigned long alarmIn)
{
object["K"] = knob;
object["G"] = gas;
object["D"] = dish;
object["A"] = alarmIn;
char statusString[100];
serializeJson(status, statusString);
Serial.println(statusString);
ESP.println(statusString);
}
void readSerial()
{
String cmd;
while (ESP.available())
{
cmd = ESP.readString();
Serial.println(cmd);
}
}
void loop()
{
sendStatus(...);
readSerial();
delay(1000);
}