除非延迟为 1,000,否则 Arduino Uno 和 ESP8266 Shield 不会通信
Arduino Uno and ESP8266 Shield won't communicate unless delay is 1,000
我在下面找到了这个盾牌,它非常适合我的 Arduino Uno。此外,我已经设法使用串行适配器和 send/receive UDP 消息将代码上传到屏蔽。如图所示,此防护罩位于 Arduino UNO 的正上方。
My ESP8266 Shield
问题是Arduino和Shield之间的通信速度很慢。
例如,我使用下面的代码给Arduino写一些使用Serial (115200)的东西。
void loop() {
writeString("Hello!");
delay(1000);
}
然后我用一个简单的代码到ESP8266 shield从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
}
}
它工作正常,"Hello!" 字符串从 ESP8266 shield 读取并使用 UDP 发送。问题是,如果我在 Arduino 中放置低于 1,000 毫秒的延迟,ESP 屏蔽不会读取任何内容,考虑到屏蔽位于 Arduino 顶部且串行通信之间没有限制,这很奇怪。
来自https://www.arduino.cc/en/Serial/ReadString:
Serial.readString() reads characters from the serial buffer into a string. The function terminates if it times out (see setTimeout()).
来自https://www.arduino.cc/en/Serial/SetTimeout:
It defaults to 1000 milliseconds.
因此,因为您使用具有默认超时的 Serial.readString()
东西,所以在接收到字符串之前总会有 1000 毫秒的延迟。
如果你非要搞乱String的话,还有一个类似的函数:Serial.readStringUntil()
:
The function terminates if the terminator character is detected or it times out
所以你让它检测字符串的终止字符:
Serial.readStringUntil('\n');
在这种情况下,超时只是一种保护措施,可以防止代码在由于某种原因终止字符不应到达时挂起,但如果一切正常,则不会发生这种情况,因此不会出现不必要的延迟。
问题是您当前的代码没有发送终止符,但这很容易修复。
我建议您考虑使用更高效、更安全的字符串(char 数组)而不是String。有一个等效函数:Serial.readBytesUntil()
.
我在下面找到了这个盾牌,它非常适合我的 Arduino Uno。此外,我已经设法使用串行适配器和 send/receive UDP 消息将代码上传到屏蔽。如图所示,此防护罩位于 Arduino UNO 的正上方。
My ESP8266 Shield
问题是Arduino和Shield之间的通信速度很慢。
例如,我使用下面的代码给Arduino写一些使用Serial (115200)的东西。
void loop() {
writeString("Hello!");
delay(1000);
}
然后我用一个简单的代码到ESP8266 shield从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
}
}
它工作正常,"Hello!" 字符串从 ESP8266 shield 读取并使用 UDP 发送。问题是,如果我在 Arduino 中放置低于 1,000 毫秒的延迟,ESP 屏蔽不会读取任何内容,考虑到屏蔽位于 Arduino 顶部且串行通信之间没有限制,这很奇怪。
来自https://www.arduino.cc/en/Serial/ReadString:
Serial.readString() reads characters from the serial buffer into a string. The function terminates if it times out (see setTimeout()).
来自https://www.arduino.cc/en/Serial/SetTimeout:
It defaults to 1000 milliseconds.
因此,因为您使用具有默认超时的 Serial.readString()
东西,所以在接收到字符串之前总会有 1000 毫秒的延迟。
如果你非要搞乱String的话,还有一个类似的函数:Serial.readStringUntil()
:
The function terminates if the terminator character is detected or it times out
所以你让它检测字符串的终止字符:
Serial.readStringUntil('\n');
在这种情况下,超时只是一种保护措施,可以防止代码在由于某种原因终止字符不应到达时挂起,但如果一切正常,则不会发生这种情况,因此不会出现不必要的延迟。
问题是您当前的代码没有发送终止符,但这很容易修复。
我建议您考虑使用更高效、更安全的字符串(char 数组)而不是String。有一个等效函数:Serial.readBytesUntil()
.