Чтение с 2 последовательных портов

У меня 2 Arduino Nano, они подключены через порты 2 и A2

Хотя я использую только один порт для приема, он работает правильно. Но если я активирую второй порт, произойдет сбой системы (и даже первый порт не будет работать должным образом)

Код первого Arduino:

#include <SoftwareSerial.h>
SoftwareSerial SerialPort2(2,A2);
SoftwareSerial SerialPort3(3,A3);

void setup() {
  SerialPort2.begin(9600);
  SerialPort3.begin(9600);
  Serial.begin(9600);
}

void loop() {
  delay(500);
  SerialPort2.listen();
  if(SerialPort2.available()){
    char value = SerialPort2.read();
    Serial.print(value);
    Serial.print(" First port\n");
  }
  // ЕСЛИ ВЫ УДАЛИТЕ ЧАСТЬ НИЖЕ, 'SerialPort2' БУДЕТ РАБОТАТЬ ПРАВИЛЬНО
  SerialPort3.listen();
  if(SerialPort3.available()){
    char value = SerialPort3.read();
    Serial.print(value);
    Serial.print(" Second port\n");
  }
  // КОНЕЦ ЭТОЙ ЧАСТИ
}

Код второго Arduino:

#include <SoftwareSerial.h>
SoftwareSerial SerialPort2(2,A2);

void setup() {
  SerialPort2.begin(9600);
}

void loop() {
  SerialPort2.write('a');
  delay(1000);
}

PS в реальной системе мне нужно прослушивать 6 портов

, 👍0

Обсуждение

Думаешь, другая сторона будет ждать, пока ты послушаешь? вы переключаете listen() так быстро, что ни один порт не будет слушать, @Juraj

@Юрай да конечно, @Abionics

так нет не дождется. он не знает, слушает ли порт, @Juraj

переключение listen() очищает буфер приема. после прослушивания() дождитесь данных, @Juraj

@Jurai у каждого сериала есть собственный буфер, @Abionics

нет. буфер является статическим, @Juraj

@Juraj, большое спасибо за ваш ответ, но если я подожду после listen (), я могу потерять данные из другого сериала. Есть ли способ получать данные с 2+ портов одновременно?, @Abionics

@Juraj, если быть точным, я не знаю порт, из которого я получаю данные. Я не получаю данные с двух портов одновременно, только с одного, но это может быть любой порт, @Abionics

можно ли использовать RS485?, @Juraj

@Юрай ни за что, он слишком большой, @Abionics

@Jurai только ard to ard без каких-либо аксессуаров, @Abionics


2 ответа


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

0

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

Использование SoftwareSerial для одновременного чтения с двух портов невозможно. Использование SoftwareSerial для чтения данных в тандеме с любыми другими аппаратными последовательными портами приведет к потере данных.

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

Получать данные "незапрошенным" способом SoftwareSerial нехорошо.

Вместо этого вам нужен аппаратный последовательный порт для каждого входящего сигнала. И, очевидно, вы не можете сделать это с такой маленькой платой, как нано. Поэтому вам нужно мыслить более творчески.

Если у вас есть один реальный последовательный порт, вы можете общаться с одним устройством. Но в вашем распоряжении есть и другие каналы связи. Итак, вы берете одну плату и подключаете ее к одному из ваших последовательных устройств. Затем вы считываете данные и конвертируете их в другой протокол связи, способный совместно использовать время с другими платами. Затем эта и 5 других плат отправляют свои данные (или получают данные) с одной центральной «главной» платы. По сути, у вас есть 6 плат преобразователя «UART в протокол X» и одна основная плата «Protocol X».

В качестве альтернативы выберите плату с 6 UART. Существует множество чипов более высокого класса, таких как некоторые чипы ATSAMD, SAMX и PIC32, которые имеют 6 доступных вам UART.

,

0

SoftwareSerial может одновременно прослушивать только один порт. Вы не можете слушать оба, ни в коем случае. Чтобы действительно слушать оба, вам нужен Arduino с большим количеством аппаратных последовательных портов, где большая часть протокола выполняется аппаратно, поэтому можно получать без вмешательства ЦП. Arduino Mega имеет 4 аппаратных последовательных порта.

Или вы можете наложить протокол на последовательный поток, чтобы прослушивающий Arduino стал мастером. Вы должны прослушать первый последовательный интерфейс, отправить через этот интерфейс стартовый байт, который сообщает ведомому Arduino начать отправку. Он отправляет, а прослушивающий интерфейс получает (передача должна быть ограничена либо ограничением по времени, например, прослушивание в течение определенного времени, либо стоп-байтом). Затем вы слушаете следующий интерфейс, снова отправляете стартовый байт и получаете. И так далее.

С таким протоколом можно было бы использовать даже один последовательный интерфейс. Протокол гарантирует, что только одно ведомое устройство передает одновременно. Хотя вы должны добавить резисторы к каждому подчиненному устройству, чтобы защитить их контакты TX.

в реальной системе мне нужно прослушивать 6 портов

Последовательный (UART) действительно не лучший тип интерфейса для такой топологии. Вам следует рассмотреть возможность использования таких интерфейсов, как SPI. Он не требует дополнительной электроники и лучше подходит для нескольких ведомых устройств.

,

В моей системе 6 мастеров и 1 раб. Какой интерфейс вы рекомендуете использовать?, @Abionics

Я написал об использовании 1 мастера, потому что предложил переосмыслить вашу топологию. Мультимастер сложен с каждым интерфейсом, который у вас есть на Nano. Вы должны подумать, действительно ли вам нужна функциональность с несколькими мастерами. Вы не описали свое приложение, поэтому я не могу об этом знать. Или, если вам это нужно, вам, возможно, придется перейти на более сложный интерфейс, который не поддерживается самим Nano., @chrisl