2

我想将我的串行通信配置为没有奇偶校验、1 个开始位和 2 个停止位。状态的文档Serial.begin(speed, config)

(...) 可选的第二个参数配置数据、奇偶校验和停止位。默认为 8 个数据位,无奇偶校验,1 个停止位。

该文档还列出了可能的配置值。根据我的(有限)理解,我需要 SERIAL_7N2 或 SERIAL_8N2 来满足我的要求。(我不确定数据位与我需要的 1 起始位有何关系。)

但是,我什至无法编译,因为我不知道如何将该配置值提供给 begin 方法。(我没有太多 Arduino/C++ 经验)。

在我的代码中,我尝试了以下两种变体:

Serial.begin(9600, SERIAL_8N2);
Serial.begin(9600, "SERIAL_8N2");

我错过了什么吗?

附加信息:

Serial.begin(speed, config)已与最新的Arduino 1.0.2 IDE版本一起推出。

可以找到定义/实现 begin 方法的代码:


编辑:

根据 PeterJ 和 borges 的回复,以下变体是正确的。

Serial.begin(9600, SERIAL_8N2); 

但是,它仍然无法正常工作。

我发现如果我将配置的板从我的 Arduino Leonardo 更改为Arduino Uno,则不会发生编译错误。

因此,它可能是一个只发生在一部分板子上的错误......或者它可能不受支持?!


编辑2:

现在已经解决了:)博尔赫斯的回答为我指出了正确的解决方案!

4

2 回答 2

5

您在评论中提到:(编辑:现在在标题中)

如果我将板子从“Arduino Leonardo”更改为“Arduino Uno”,我不会收到编译错误。

Arduino Leonardo 在串行通信方面有一些特点:

  1. Leonardo 有一个具有原生 USB 通信功能的微控制器 ( ATmega32U4 )。为了保持整个生态系统已经建立的兼容性,Leonardo 通过 USB 虚拟化了串行通信。您可以使用代码访问此通信Serial。实际上,您可以通过 USB 插头访问该通信。

  2. 要使用“真正的”串行通信(AKA 串行 TTL),您需要使用引脚 0(RX)和 1(TX)。在您将使用的代码中Serial1(注意数字 1!)。

一个例子:

void setup() {
    Serial1.begin(9600, SERIAL_8N2);
    Serial1.println("Hello?");
}

void loop() {
}

更多信息(推荐):

于 2012-12-08T03:40:25.637 回答
1

第一种方法应该没问题,所以你有编译器配置或包含问题。确保文件顶部包含以下内容:

#include <HardwareSerial.h>

此外,虽然 SERIAL_8N2 有效,但它是一个很少使用的奇怪设置。您很可能需要 SERIAL_8N1。

于 2012-12-08T02:48:12.307 回答