Странное поведение 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 совпадает с ожидаемым результатом? Разве это не должно оказывать одинаковое влияние на оба ардуино?

ТИА!

, 👍1


1 ответ


1

Является ли одним из недостатков SoftwareSerial, о котором вы знаете, тот факт, что только один SoftwareSerial может быть настроен на одновременный прием данных?

Вы должны выбрать один и только один экземпляр для получения данных с помощью метода .listen() .

Если вы хотите иметь возможность получать данные с нескольких устройств одновременно, вам придется использовать либо аппаратные UARTs, либо один программный сервер и инфраструктуру "шины" (RS485 или аналогичную).

,