前言

做了很久的Arduino Nano Everything的Serial通信,发现怎么都无法成功,最后得出结果,Serial通常与USB接口联通,提供下载程序的功能;如果需要其他的串行通信,则需要Serial1、Serial2 ... 等,但是奈何Arduino Nano Everything只有Serial,而没有Serial1或者Serial2等,所以只能用SoftwareSerial等软件模拟接口(请纠正我,如果我说的有错)

为此,特地去买了两台Arduino Uno R4 Wifi,此开发板既有Serial也有Serial1;于是乎用Serial1来进行通信,发现成功。

正文

其实在Arduino Uno R4 Wifi的时候也试了很久的Serial,发现也是无法通信,最后通过Github发现,自己连接的TX(pin D1) 和 RX(pin D0)其实是Serial1的通信接口(还是要好好看开发文档啊...),于是乎成功!

Github的发现在此:

For the record:

I use SoftwareSerial on R4 Wifi, using ports 0,1 
(yes, ports of Serial1). When i disconnect USB C, 
Arduino capture the information without problems 
(im sending information via MQTT to see the data).

成功用Serial1通信的代码:

Arduino 1

// SerialMaster

#include <SoftwareSerial.h>
#define RX 8                           // 软件模拟通信接口RX
#define TX 11                          // 软件模拟通信接口TX
SoftwareSerial mySerial(RX, TX);       // 软件模拟通信

void setup() {
  Serial.begin(9600);                  // 开启Serial Monitor 人机交互
  Serial1.begin(9600);                 // 开启Serial1 硬件通信
  //mySerial.begin(9600);              // 开启mySerial 软件模拟通信
  Serial.println("Ready");
}

void loop() {
  if (Serial.available()) {
    //mySerial.write(Serial.read());    // Serial Monitor读取写入mySerial通信
    Serial1.write(Serial.read());       // Serial Monitor读取写入Serial1通信
  }
}

Arduino 2

// SerialSlave

#include <SoftwareSerial.h>
#define RX 8                                     // 软件模拟通信接口RX
#define TX 11                                    // 软件模拟通信接口TX
SoftwareSerial mySerial(RX, TX);                 // 软件模拟通信

void setup() {
  Serial.begin(9600);                            // 开启Serial Monitor 人机交互
  Serial1.begin(9600);                           // 开启Serial1 硬件通信
  //mySerial.begin(9600);                        // 开启mySerial 软件模拟通信
  Serial.println("Ready");
}

void loop() {
  //if (mySerial.available()) {                  // 若mySerial有信号传入
  //  String str = mySerial.readString();        
  //  Serial.print("SoftwareSerial: " + str);    // 将信号内容写入Serial Monitor
  //}
  if (Serial1.available()) {                     // 若Serial1有信号传入
    String str = Serial1.readString();
    Serial.print("Serial1: " + str);             // 若Serial1有信号传入
  }
}

总结

搞了快3个月的硬件串行通信,终于多多少少快搞好了,好多坑orz!

但是现在既能用Serial1,又能用SoftwareSerial了捏~~! (*^_^*)

参考

[1] SoftwareSerial (FAIL)

Q.E.D.


立志做一个有趣的碳水化合物