前言
做了很久的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.