代码之家  ›  专栏  ›  技术社区  ›  Zorglub29

在Arduino IDE中自动检测串行端口使用中的错误

  •  0
  • Zorglub29  · 技术社区  · 6 年前

    我在有几个串行端口的Arduino板上编程 Serial , Serial1 Serial3 )每个端口都是单独的对象。要使用端口,首先需要使用 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核心/变体,以便在使用它们之前需要自己声明它们?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Nitro    6 年前

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

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

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

    一个更简单的解决方案是让宏保存您想要使用的串行对象

    #define CONTROL_PORT    Serial
    #define COMMUNICATION_PORT  Serial3
    

    在您的代码中,使用控制端口和通信端口的方式如下

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

    有了这个,你将永远不会面临打字错误,你可以随时将serial1改为serial3。 我希望这有帮助。