我最近买了一台Arduino UNO来读取智能电表输出的数据。仪表使用串行通信,我希望看到我的笔记本电脑屏幕上输出的值。我想我需要使用SoftwareSerial库来读取传入的数据,并使用Arduino IDE中的硬件串口和串行监视器在屏幕上打印该数据。为了熟悉Arduino上的(软件)串行通信,我查看了SoftwareSerial库的文档。问题是,我无法获得最基本的工作示例,而且我已经坚持了很长一段时间了。示例代码如下,示例can be found here
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(57600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("Goodnight moon!");
// set the data rate for the SoftwareSerial port
mySerial.begin(4800);
mySerial.println("Hello, world?");
}
void loop() { // run over and over
if (mySerial.available()) {
Serial.write(mySerial.read());
}
if (Serial.available()) {
mySerial.write(Serial.read());
}
}
据我了解,应该发生以下情况:
- 在Serial Monitor窗口中键入文本。
- Serial.read()
读取此数据并将其写入软件序列。
- 软件串行读取此数据并将其写回串行。
- 写的内容出现在屏幕上。
但无论我尝试什么,都没有任何反应。在我试图遵循的事情中:
- 更改软件和硬件序列的波特率(例如9600)。
- 尝试了不同的SoftwareSerial库(AltSoftSerial)。
- 为SoftwareSerial尝试了不同的RX和TX引脚。
- 而不是Serial.write(mySerial.read());
,而是先将结果存储在char
。
我可能错过了一些明显的东西。如果有人能够对此有所了解,或者为我提供从智能电表读取数据的替代方法,我将不胜感激。
修改
我没有接线,因为示例中指出“此示例没有电路”。我尝试了@ slash-dev建议的所有三个选项,但没有一个具有预期的行为:
SoftwareSerial
,电线将引脚1连接到引脚10,引脚0连接到引脚11.它打印出奇怪的字符:
Goodnight moon!
Ùniÿhtÿmoÿn!ÿ
nihtmoÿttt
AltSoftSerial
,电线连接1-8和0-9。首先打印Goodnight moon!
,然后继续打印Ô당¥�¡Ñ�moon!
。
NeoSWSerial
,电线连接1-10和0-11。与AltSoftSerial
相同,但保持打印Ôë‹–+ë¡Ñ�j½½¹…j
。
答案 0 :(得分:1)
Serial
和mySerial
上的波特率必须相同。
你没有描述连接,所以我不得不问:你是否从引脚1(Serial
发送)到引脚10(mySerial
接收)连接了一根电线,还有另一根电线来自引脚0(Serial
接收)到引脚11(mySerial
发送)?注意它们是如何交叉的。
AltSoftSerial
真的是最好的选择,但它只适用于引脚8(RX)和引脚9(TX),这需要连接8到1和9到0. SoftwareSerial是非常低效的,因为它长时间禁用中断。这可能会干扰草图或其他库的其他部分。
我的NeoSWSerial图书馆是另一种选择。它几乎和AltSoftSerial
一样有效,但它适用于任何两个引脚。它可以同时发送和接收(与SoftwareSerial不同),但它仅适用于波特9600,19200和38400。
修改强>
我认为你所尝试的可能正常。所有软件串行库都使用中断来处理单个位,而不是每个字符一个中断。当系统中存在其他中断时(millis()TIMER0或Serial
),可能会影响“计算”位。这表现为接收错误的字节。您的环回测试使其特别容易受到影响,因为发送和接收是同步的(初始接收中断发生在发送中断启动下一个字符时)。
如果您只是将0连接到1,我认为它将起作用,因为UART能够同时发送和接收,并且它处理完整的字符,而不是位。字符中断不会干扰位的发送或接收。
在开发NeoSWSerial库时,我已经看到了相同的方式。我不得不使用两个Arduinos来完全测试异步(即,未同步)。在您的情况下,使用AltSoftSerial作为SmartMeter应该可以正常工作,您可以选择不同的波特率。如果您将SmartMeter字符回显到Serial
,请确保Serial
上的波特率更高。