Задать вопрос
@SmeliyR

Сможет ли нейросеть написать скетч для Arduino mini мультиплексор нескольких COM портов в один?

Понадобилось сделать мультиплексор нескольких COM портов в
виртуальный COM порт USB (на ардуине), чтобы подключить несколько
самодельных музыкальных инструментов к компу, на котором один COM1 порт (а так как будет ардуина с USB,
можно будет использовать и комп без COM порта). Сейчас они либо по очереди
подключаются либо к разным компам, а так можно будет
подключать всё сразу.

Написанием скетча планирую заняться через пару недель.

Но возникла мысль, а может ли нейросеть написать этот скетч вместо меня? Я пока далёк от нейросетей, поэтому
просьба: у кого под рукой нейросетка, которая умеет прогать, задайте ей задачу (если вы юзали нейросеть локально, напишите плиз какую и как её поставить на свой комп):

----------------------------------------------------------------------------------
написать скетч ArduinoIDE для Arduino Nano, который будет делать следующее
Слушать 4 цифровых входа D0,D1,D2,D3, считая их как входы SoftwareSerial,
по которым идёт передача данных на скорости 115 200 от внешних устройств к Arduino.
Все данные с них выводить на стандартный HardwareSerial порт в
компьютер, соединение с которым установлено на скорости 1 000 000.
При этом перед каждым байтом данных нужно передавать служебный байт - номер входа, откуда поступил байт
от 0 до 3.
Оверхед таким образом получается 100%, но это не страшно, ведь с компьютером скорость соединения более чем в 8
раз больше, чем с каждым из входящих портов.
  • Вопрос задан
  • 95 просмотров
Подписаться 1 Средний 4 комментария
Пригласить эксперта
Ответы на вопрос 1
fox_12
@fox_12
Расставляю биты, управляю заряженными частицами
Не проверял:
#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 преобразователи.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы