我的盾牌下方与我的Arduino Uno配合得很好。此外,我已设法使用串行适配器将代码上传到屏蔽并发送/接收UDP消息。如图所示,这个盾牌正好位于Arduino UNO之上。
问题是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的顶部,串行通信之间没有限制。
答案 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()
。