【问题标题】:SoftwareSerial example not working as expectedSoftwareSerial 示例未按预期工作
【发布时间】:2016-11-10 23:59:40
【问题描述】:

我最近买了一个 Arduino UNO 来读取我的 Smart Meter 输出的数据。仪表使用串行通信,我想在我的笔记本电脑屏幕上看到输出的值。我想我需要使用 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.read() 读取此数据并将其写入软件串行。 - 软件串行读取此数据并将其写回串行。 - 写入的内容出现在屏幕上。

但无论我尝试什么,都没有任何反应。在我试图遵循的事情中: - 更改软件和硬件串行的波特率(例如 9600)。 - 尝试了不同的 SoftwareSerial 库 (AltSoftSerial)。 - 为 SoftwareSerial 尝试了不同的 RX 和 TX 引脚。 - 首先将结果存储在char 中,而不是Serial.write(mySerial.read());

我可能遗漏了一些明显的东西。如果有人能对此有所了解或提供另一种方法让我从智能仪表中读取数据,我将不胜感激。

编辑

我没有接线,因为示例指定“此示例没有电路”。我尝试了@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

【问题讨论】:

  • “智能电表”?哪一个?
  • 火星382,手册可以是found here。我想收集有关能源使用的信息并将这些数据存储在我自己服务器上的数据库中。
  • 您是否将 Arduino UNO 上的地线连接到智能电表的地线?如果您忘记了这一点,您可能会看到这种行为:)
  • @ErwinJanssen,在下面编辑

标签: arduino arduino-uno software-serial


【解决方案1】:

SerialmySerial 的波特率必须相同。

而且您没有描述连接,所以我不得不问:您是否将一根线从针 1(Serial 发送)连接到针 10(mySerial 接收),另一根线从针 0(@ 987654326@ 接收)到引脚 11(mySerial 发送)?注意它们是如何交叉的。

AltSoftSerial 确实是最好的选择,但它只适用于 pin 8 (RX) 和 pin 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 上具有更高的波特率。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 1970-01-01
    相关资源
    最近更新 更多