debugging - 自动检测 Arduino IDE 中使用串行端口的错误
问题描述
我正在具有多个串行端口的 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 核心/变体,这样我需要自己声明它们才能使用它们?
解决方案
虽然看起来不公平,但编译器所做的是正确的。编译器必须按照您编写的方式编译代码。
尽管人们对代码辅助的工作和代码编译器的工作感到困惑,但确保正确编写代码是您的工作。确认代码是否遵循正确的语法是编译器的工作。
至于制作电路板变体并将其包含到 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。我希望这有帮助。
推荐阅读
- joomla - Joomla Vikrestraurant 插件更改 discountitem.php 中的代码 - 无效
- r - R中的非线性混合效应编码
- python - 如何从 python 中的两个 tif 文件创建二维 numpy 数组?
- javascript - 如何添加/删除类
- 是动态生成的?
- python - Google OR-Tools 错误:不支持将 BoundedLinearExpr 评估为布尔值
- android - 在使用 compose 创建应用程序时,此处使用的适当 Kotlin Flow 是什么?
- javascript - InputTag.js:100 Uncaught (in promise) TypeError: items.map in React Native
- python - IDLE RunModule Restart:Shell 强制连接到树莓派
- javascript - 如何选择不能成为组成员且在正则表达式中不为空的表达式以进行降价?
- amazon-web-services - 最大事件通知(s3 侦听器)可能在 1 个 s3 存储桶中