Невозможно получить данные при использовании нескольких SoftSerial на Arduino Nano.

Я пытаюсь использовать несколько (четыре) программных последовательных порта для связи с различным периферийным оборудованием. Однако я не могу получать данные через SoftSerial при использовании более одного последовательного порта программного обеспечения.

Я протестировал каждую пару контактов, определяя ее для первого порта. Все пары работают как положено. Кроме того, меня интересует только мостовое соединение/переключение последовательного порта программного обеспечения с последовательным портом оборудования (в целях отладки).

Мой код выглядит следующим образом:

#include <stdint.h>
#include <SoftwareSerial.h>

#define SOFT_SERIAL_A_RX        5
#define SOFT_SERIAL_A_TX        6
#define SOFT_SERIAL_B_RX        7
#define SOFT_SERIAL_B_TX        8
#define SOFT_SERIAL_C_RX        9
#define SOFT_SERIAL_C_TX        10
#define SOFT_SERIAL_D_RX        11
#define SOFT_SERIAL_D_TX        12

#define SERIAL_BAUD_RATE        9600


SoftwareSerial softwareSerials[] = {
    SoftwareSerial(SOFT_SERIAL_A_RX, SOFT_SERIAL_A_TX),
    // Unable to receive data on first software serial when un-commenting following lines.
    // All pins are working when declaring each pair for first software serial (tested pins by doing this)
    // SoftwareSerial(SOFT_SERIAL_B_RX, SOFT_SERIAL_B_TX),
    // SoftwareSerial(SOFT_SERIAL_C_RX, SOFT_SERIAL_C_TX),
    // SoftwareSerial(SOFT_SERIAL_D_RX, SOFT_SERIAL_D_TX)
};
const uint8_t numberSoftwareSerials = sizeof(softwareSerials)/sizeof(*softwareSerials);



void initHardwareSerial()
{
  Serial.begin(SERIAL_BAUD_RATE);
}


void initSoftwareSerials()
{
    for(uint8_t i=0; i<numberSoftwareSerials; i++) {
        softwareSerials[i].begin(SERIAL_BAUD_RATE);
    }
}


void setup()
{
    initHardwareSerial();
    initSoftwareSerials();
}


void loop()
{
  // Only one software serial can be used (receive/transmit) at once.
  // So just using a single software serial port (first element from array)
  if (softwareSerials[0].available()) {
    Serial.write(softwareSerials[0].read());
  }
  if (Serial.available()) {
    softwareSerials[0].write(Serial.read());
  }

}

Как я могу сузить проблему невозможности получения при определении нескольких последовательных портов? Если подходящего решения нет, я мог бы переключиться на Arduino Mega с четырьмя аппаратными портами (в этом случае потребуется только один дополнительный последовательный программный порт), но Arduino Nano настоятельно предпочтительнее из-за меньшего размера.

, 👍0


1 ответ


Лучший ответ:

2

Вы не можете получать данные более чем через один порт SoftwareSerial. Печально, но это так.

Вы можете вручную выбрать, какой порт вы прослушиваете, в любое время с помощью функции softwareSerials[x].listen(), но одновременно прослушивать может только один порт.

SoftwareSerial — это в лучшем случае выдумка, и его следует использовать только для одного порта, и то только в том случае, если вам действительно необходимо.

,

Спасибо за эту подсказку. После некоторых поисков в Интернете я наконец нашел ссылку на документацию, где используется '.listen()': https://www.arduino.cc/en/Tutorial/TwoPortReceive, @albert