前言
昨天Arduino Uno到了,想试试看SoftwareSerial是否能在Arduino Uno上使用,但是发现无论如何两边都接收不到对面的信息,百思不得其解。
后来发现是因为自己的TX连在了D11,RX连在了D10的原因。
根据答案来说,对于Arduino Uno R4来说,TX可以是任意的pin,但是RX只有固定的pin才能用。
正文
1. 原来的Arduino代码
Arduino 1:
// SerialMaster
#include <SoftwareSerial.h>
#define RX 10
#define TX 11
SoftwareSerial mySerial(RX, TX);
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("Master node ready ...");
}
void loop() {
if (Serial.available()) {
mySerial.write(Serial.read())
}
}
Arduino 2:
// SerialSlave
#include <SoftwareSerial.h>
#define RX 10
#define TX 11
SoftwareSerial mySerial(RX, TX);
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("Slave node ready ...");
}
void loop() {
if (mySerial.available()) {
Serial.write(mySerial.read());
}
}
来自Github的一语惊醒梦中人!
// Hello!
// Not all pins can be used for SoftwareSerial.
// See this note in the examples for SoftwareSerial on UNO R4:
// Note any pin can be used for TX, but only the following pins
// can be used for RX:
// D0, D1, D2, D3, D8, D14, D15, A1, A2, A3, A4, A5
2. 更改后的Arduino代码
其实根据Github的留言,只需要把RX的pin改成D0, D1, D2, D3, D8, D14, D15, A1, A2, A3, A4, A5
其中之一就可以了。
Arduino 1:
// SerialMaster
#include <SoftwareSerial.h>
#define RX 8
#define TX 11
SoftwareSerial mySerial(RX, TX);
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("Master node ready ...");
}
void loop() {
if (Serial.available()) {
mySerial.write(Serial.read())
}
}
Arduino 2:
// SerialSlave
#include <SoftwareSerial.h>
#define RX 8
#define TX 11
SoftwareSerial mySerial(RX, TX);
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("Slave node ready ...");
}
void loop() {
if (mySerial.available()) {
Serial.write(mySerial.read());
}
}
记得把电路也改了~ 但是也就是Arduino 1 和 2的RX从原来的pin D10 变成了现在的 pin D8而已~。
总结
对于Arduino Uno R4 Wifi而言:
- TX 可以是任意的pin
- RX 只能是
D0, D1, D2, D3, D8, D14, D15, A1, A2, A3, A4, A5
参考
Q.E.D.