首页 > 解决方案 > 自动检测 Arduino IDE 中使用串行端口的错误

问题描述

我正在具有多个串行端口的 Arduino 板上编程(让我们现在说SerialSerial1Serial3)。每个端口都是一个单独的对象。对于使用端口,首先需要使用begin()方法对其进行初始化(我在这里需要的意思是让它正常工作)。问题是,默认情况下,相应的对象在 Arduino IDE 中都是可用的,即使你没有在你的草图中声明/初始化它们,所以不需要调用构造函数和/或初始化串口来使用它(我在这里所说的必需是应该做些什么来避免编译器错误)。结果,以下类型的代码编译得很好,但有一个错字:

byte crrt_char;

void setup(){
  Serial.begin(115200);
  delay(100);

  Serial.println("booted");

  Serial3.begin(57600);
  // Serial1.begin(9600);
  delay(100);
}

void loop() {
  if (Serial3.available() > 0){
    crrt_char = Serial1.read();
    Serial.println(crrt_char, HEX);
    delayMicroseconds(5);
  }
}

(在循环中应该是 Serial3 而不是 Serial1)。

我被这种错误咬了一口,浪费了很多时间调试(当然是在更复杂的代码中)好几次,我很难过编译器没有救我(对我来说,这看起来像是编译器的工作检查这种错字,不是吗?)。有什么方法可以让我获得一些编译器帮助来检测这种错误吗?

Arduino 内核可在此处获得:

https://github.com/arduino/ArduinoCore-avr

是否有可能在没有预先声明的串行端口的情况下编写我自己的 Arduino 核心/变体,这样我需要自己声明它们才能使用它们?

标签: debuggingarduinoserial-port

解决方案


虽然看起来不公平,但编译器所做的是正确的。编译器必须按照您编写的方式编译代码。

尽管人们对代码辅助的工作和代码编译器的工作感到困惑,但确保正确编写代码是您的工作。确认代码是否遵循正确的语法是编译器的工作。

至于制作电路板变体并将其包含到 Arduino 核心中,您必须更改 HardwareSerial.h 文件,以确保未声明任何不必要的串行对象。

一个更简单的解决方案是让宏保存您想要使用的 Serial 对象,如下所示

#define CONTROL_PORT    Serial
#define COMMUNICATION_PORT  Serial3

并在您的代码中以下列方式使用 CONTROL_PORT 和 COMMUNICATION_PORT

CONTROL_PORT.begin(9600);
COMMUNICATION_PORT.begin(9600);

有了这个,您将永远不会遇到拼写错误,并且您可以随时将 Serial1 更改为 Serial3。我希望这有帮助。


推荐阅读