前言

昨天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而言:

  1. TX 可以是任意的pin
  2. RX 只能是D0, D1, D2, D3, D8, D14, D15, A1, A2, A3, A4, A5

参考

[1] SoftwareSerial (FAIL)

Q.E.D.


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