Странное поведение SoftwareSerial с Arduino nano при настройке нескольких объектов SoftwareSerial
Так что я застрял с этим уже несколько дней и действительно не могу понять, что здесь не так. Любая помощь была бы очень кстати. Старайтесь не перечислять недостатки SoftwareSerial, я о них знаю. Является ли эта проблема причиной этого?
Чего я пытаюсь достичь? Два Arduino (Nanos) подключены друг к другу и пытаются взаимодействовать друг с другом через SoftwareSerial UART (несколько Arduino подключены к нескольким Arduino, но для минимализма кода предположим, что связь один к одному).
Код для Arduino 1:
#include <SoftwareSerial.h>
String val = "4";
SoftwareSerial a(6, 7); // rx, tx
SoftwareSerial b(8, 9); // rx, tx
SoftwareSerial c(10, 11); // rx, tx
SoftwareSerial d(12, 13); // rx, tx
String a_s, b_s, c_s, d_s;
void setup() {
a.begin(9600);
b.begin(9600);
c.begin(9600);
d.begin(9600);
Serial.begin(9600);
a_s = "";
b_s = "";
c_s = "";
d_s = "";
}
void loop() {
delay(100);
d.print(val);
if(d_s == "") {
if(d_s == "" && d.available()) {
char rd = d.read();
Serial.print("ddddddddddd ");
Serial.println(rd);
d_s = rd;
}
}
}
Код для Arduino 2:
#include <SoftwareSerial.h>
String val = "5";
SoftwareSerial a(6, 7); // rx, tx
SoftwareSerial b(8, 9); // rx, tx
SoftwareSerial c(10, 11); // rx, tx
SoftwareSerial d(12, 13); // rx, tx
String a_s, b_s, c_s, d_s;
void setup() {
a.begin(9600);
b.begin(9600);
c.begin(9600);
d.begin(9600);
Serial.begin(9600);
a_s = "";
b_s = "";
c_s = "";
d_s = "";
}
void loop() {
delay(100);
b.print(val);
if(b_s == "") {
if(b.available()) {
char rd = b.read();
Serial.print("bbbbbbbbbbbb ");
Serial.println(rd);
b_s = rd;
}
}
}
Фактический и ожидаемый результат для Arduino 1:
дддддддддддд 5
Фактический выход для Arduino 2: (нет выхода !!)
Ожидаемый результат для Arduino 2:
bbbbbbbbbbbbb 4
Во время отладки я понял, что если я закомментирую c.begin(9600) и d.begin(9600) из кода для Arduino 2, фактический результат будет таким же, как ожидаемый результат.
// c.begin(9600);
// d.begin(9600);
О, и да, соединения заключаются в следующем:
ard1 | ard2 |
---|---|
ВНД | ВНД |
D12 | D9 |
D13 | D8 |
Оба Arduino подключены (и, следовательно, питаются) через отдельные кабели к одному и тому же ноутбуку. Есть ли что-то, чего я не понимаю? Я знаю, что у SotfwareSerial есть свои недостатки, но является ли это причиной SoftwareSerial? Если да, то почему фактический результат Arduino 1 совпадает с ожидаемым результатом? Разве это не должно оказывать одинаковое влияние на оба ардуино?
ТИА!
@dravit, 👍1
1 ответ
Является ли одним из недостатков SoftwareSerial, о котором вы знаете, тот факт, что только один SoftwareSerial может быть настроен на одновременный прием данных?
Вы должны выбрать один и только один экземпляр для получения данных с помощью метода .listen()
.
Если вы хотите иметь возможность получать данные с нескольких устройств одновременно, вам придется использовать либо аппаратные UARTs, либо один программный сервер и инфраструктуру "шины" (RS485 или аналогичную).
- Проблема последовательной связи с общей землей SIM800L
- Как выбрать использование библиотеки softserial в проекте Arduino?
- В чем разница между библиотеками Software Serial? Какая из них совместима с Arduino Nano?
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Использование SoftwareSerial вместе с библиотекой FastLED для управления светодиодами WS2812
- Использование последовательных контактов TX/ RX для связи по USB
- SIM800L не отвечает на AT-команды
- HLW8032 UART отправляет случайные данные (регистры часто переполняются)