Не проверял:
#include <SoftwareSerial.h>
// Создаем 4 программных UART на указанных пинах (RX, TX)
SoftwareSerial Serial0(4, 255); // D4 - RX, TX не используется
SoftwareSerial Serial1(5, 255); // D5 - RX
SoftwareSerial Serial2(6, 255); // D6 - RX
SoftwareSerial Serial3(7, 255); // D7 - RX
void setup() {
// Инициализация аппаратного UART для вывода
Serial.begin(1000000);
// Инициализация программных портов
Serial0.begin(115200);
Serial1.begin(115200);
Serial2.begin(115200);
Serial3.begin(115200);
}
void loop() {
processPort(Serial0, 0); // Обработка порта 0
processPort(Serial1, 1); // Обработка порта 1
processPort(Serial2, 2); // Обработка порта 2
processPort(Serial3, 3); // Обработка порта 3
}
void processPort(SoftwareSerial &port, uint8_t id) {
port.listen(); // Активируем текущий порт
while(port.available() > 0) {
// Читаем данные и отправляем с префиксом
Serial.write(id); // Служебный байт
Serial.write(port.read()); // Данные с устройства
}
}
Ключевые особенности реализации:
Выбор пинов
Использованы пины D4-D7 для приема данных, чтобы избежать конфликта с аппаратным UART (D0/D1). Если требуется использовать именно D0-D3, потребуется:
Отключить аппаратный UART
Использовать USB-UART адаптер для программирования
Оптимизация скорости
Аппаратный UART настроен на 1 000 000 бод, что позволяет передавать два байта на каждый принятый (100% оверхеда) даже при максимальной нагрузке 4×115200 = 460800 бод.
Особенности SoftwareSerial
Одновременная работа только с одним портом
Требуется циклическое переключение между портами
Возможны потери данных при высокой нагрузке
Рекомендации по улучшению
cpp
// Альтернатива с NeoSWSerial для стабильной работы
#include
NeoSWSerial Serial0(4, 255);
// ...аналогично для других портов...
Библиотека NeoSWSerial обеспечивает:
Более надежный прием на высоких скоростях
Совместимость с прерываниями
Поддержку скоростей до 38400 бод
Для максимальной надежности рекомендуется использовать Arduino Mega с аппаратными UART или внешние USB-UART преобразователи.