1

我最近买了一个 Arduino UNO 来读取我的 Smart Meter 输出的数据。仪表使用串行通信,我想在我的笔记本电脑屏幕上看到输出的值。我想我需要使用 SoftwareSerial 库来读取传入的数据,并使用 Arduino IDE 中的硬件串行和串行监视器在我的屏幕上打印该数据。为了熟悉 Arduino 上的(软件)串行通信,我查看了 SoftwareSerial 库的文档。问题是,我无法让最基本的示例工作,而且我已经坚持了很长一段时间。示例代码如下,示例可以在这里找到

#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.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

4

1 回答 1

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 库时,我以同样的方式看到了这个清单。我不得不使用两个 Arduino 来完全异步测试(即不同步)。在您的情况下,为 SmartMeter 使用 AltSoftSerial 应该可以正常工作,并且您可以选择不同的波特率。如果您将 SmartMeter 字符回显到Serial,请确保您有更高的波特率Serial

于 2016-11-11T00:22:49.063 回答