SoftwareSerial示例未按预期工作

时间:2016-11-10 23:59:41

标签: arduino arduino-uno software-serial

我最近买了一台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

1 个答案:

答案 0 :(得分:1)

SerialmySerial上的波特率必须相同。

你没有描述连接,所以我不得不问:你是否从引脚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上的波特率更高。