ESP32硬件串口接收垃圾字符

问题描述 投票:0回答:1

我有两个通过串行电缆背对背连接的 ESP32 板,使用引脚 16 用于 Rx,使用引脚 17 用于 Tx。它们通过 ESP32 上的串行 2 硬件端口交换简单的 hello world 消息。收到的消息会在常规串行端口 0 上回显,以便我可以通过 USB 电缆在 PC 上监视它们。

除了 Rx 和 Tx 引脚以及连接到 PC 的 USB 电缆外,板上没有其他连接。

此测试是为更大的项目做准备,其中一块板将通过串行2端口发送命令消息,另一块板将执行它们。

这是我的测试程序的概要:

String str;
void setup() {
  Serial.begin(115200);
  Serial2.begin(115200);
}

void loop(){
  while(Serial2.available()) {  
    str = Serial2.readStringUntil('\n');
    Serial.println(str);
    Serial2.println("OK);
  }
}

发送端更简单:

void loop(){
  Serial2.println("Hello world");
  delay(4000);
}

程序运行正常,消息发送和接收准确。但不幸的是,当其中一块板尚未初始化时, 另一块板上的串行端口吐出很多随机字符,例如

K⸮}⸮⸮⸮KK⸮-mo⸮⸮m⸮⸮[K⸮⸮⸮⸮⸮
一旦发送者初始化并开始发送常规消息,垃圾就会消失并显示常规消息。

我尝试过将波特率降低到9600,通过电线连接两块板的接地引脚等。但到目前为止,垃圾打印还没有消失。这在我的主程序中将是危险的,因为随机消息可能会操作无意的中继并触发其他不需要的操作。请建议一些隔离问题的方法。

编辑:我在发送端初始化串口之前设置了延迟:

delay(10000);
Serial2.begin(115200);

接收器在这 10 秒内不间断地倾倒垃圾字符!

注:我对反对票感到惊讶;我并不是在寻求解决我的问题的方法;我已经通过使用简单的纠错技术解决了这个问题。但我在这里提出它是对所有未来串口用户的警告,以便我们能够共同尝试理解这个问题。

我只是想了解为什么 ESP32 会以这种意想不到的方式表现。我还在 ESP32 Git 存储库中将其作为错误提出。

serial-port arduino-esp32
1个回答
0
投票

开发者回复称,串口引脚在初始化之前会处于未定义状态。所以我在软件中做了一个变通:我只是在收到已知标记之前忽略所有字符。就目前而言,这对我来说效果很好。但这只是把问题掩盖起来。

概率论说,如果足够数量的猴子在足够长的时间内随机打字,那么你可以期望在它们的输出中看到莎士比亚的名言!

如果未初始化的输出引脚将处于未定义状态,根据设计,它是一个定时炸弹。这种工程实践导致了航天飞机爆炸和核反应堆熔化!

更好的设计是默认在输入模式下启动引脚。在初始化串行端口之前,软件可能需要几毫秒的时间来完成启动例程、读取配置设置等。到那时端口至少可以保持沉默。

© www.soinside.com 2019 - 2024. All rights reserved.