从Arduino Uno转移到NodeMCU时如何获取无垃圾值

时间:2019-06-17 19:19:00

标签: firebase arduino arduino-uno nodemcu arduino-esp8266

我已将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的串行监视器中看到的完整字符串。

1 个答案:

答案 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);
}