前言
做了很久的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了捏~~! (*^_^*)
参考
Q.E.D.