我正在使用具有多个串口的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核心/变体,以便在使用它之前我需要自己声明它们?
答案 0 :(得分:1)
虽然看似不公平,但编译器正在做的是正确的。编译器必须按照编写代码的方式编译代码。
尽管人们对代码辅助工作与代码编译工作感到困惑,但确保代码编写正确是你的工作。编译器的工作是确认代码是否遵循正确的语法。
至于制作一个电路板变体并将其包含在Arduino Core中,您必须对HardwareSerial.h文件进行更改,以确保不声明任何不必要的串行对象。
更简单的解决方案是使宏保持您想要使用的串行对象
#define CONTROL_PORT Serial
#define COMMUNICATION_PORT Serial3
在您的代码中,以下列方式使用CONTROL_PORT和COMMUNICATION_PORT
CONTROL_PORT.begin(9600);
COMMUNICATION_PORT.begin(9600);
有了这个,您将永远不会遇到拼写错误,您可以随时将Serial1更改为Serial3。 我希望这会有所帮助。