除非延迟为1,000,否则Arduino Uno和ESP8266 Shield不会进行通信

时间:2017-10-08 16:52:54

标签: arduino serial-port udp esp8266

我的盾牌下方与我的Arduino Uno配合得很好。此外,我已设法使用串行适配器将代码上传到屏蔽并发送/接收UDP消息。如图所示,这个盾牌正好位于Arduino UNO之上。

My ESP8266 Shield

问题是Arduino和Shield之间的通信非常缓慢。

例如,我使用下面的代码将Arduino用Serial(115200)写一些东西。

void loop() {
  writeString("Hello!");
  delay(1000);
}

然后我用ESP8266屏蔽的简单代码从Arduino读取数据并通过UDP发送(writeString只是一个简单的转换器)。

Udp.beginPacket(ip, localUdpPort);
writeString(Serial.readString());
Udp.endPacket();

void writeString(String stringData) {
  for (int i = 0; i < stringData.length(); i++) {
    Serial.write(stringData[i]);
    // Push each char 1 by 1 on each loop pass
  }
}

它运作正常,&#34;你好!&#34;从ESP8266屏蔽读取字符串并使用UDP发送。问题是,如果我在Arduino中放置了低于1,000毫秒的延迟,ESP屏蔽不会读取任何内容,这很奇怪,考虑到屏蔽位于Arduino的顶部,串行通信之间没有限制。

1 个答案:

答案 0 :(得分:2)

来自https://www.arduino.cc/en/Serial/ReadString

  

Serial.readString()将串行缓冲区中的字符读入字符串。如果函数超时,函数将终止(参见setTimeout())。

来自https://www.arduino.cc/en/Serial/SetTimeout

  

默认为1000毫秒。

因为你在默认超时时使用这个Serial.readString()的东西,在收到字符串之前总会有1000毫秒的延迟。

如果您坚持使用String,则有类似的功能:Serial.readStringUntil()

  

如果检测到终止符或超时

,函数将终止

所以你让它检测到字符串的终止字符:

Serial.readStringUntil('\n');

在这种情况下,如果由于某种原因终止字符不应该到达,则超时仅仅是保护代码不被挂起的安全措施,但如果事情正常工作则不会发生这种情况,因此没有不必要的延迟。

问题在于您当前的代码没有发送终结符,但这很容易修复。

我建议您考虑使用更高效,更安全的字符串(char数组)而不是String。有一个等效函数:Serial.readBytesUntil()