Максимальная последовательная скорость CH340
С платой типа Arduino, использующей последовательный чип CH340 USB Serial, я хотел бы как можно быстрее отправлять текстовые строки на Raspberry Pi через USB с помощью функции Serial.println(). Проблема в том, что когда я устанавливаю последовательную скорость на значения выше 230 400 с помощью функции Serial.begin(speed), происходит сбой консоли Arduino, и программа C на Rapsberry Pi отображает мусор в своей консоли, даже если я установил ту же последовательную скорость.
Краткие примеры:
Serial.begin(230400);
Serial.println("Test !"); // Работает отлично.
Serial.begin(250000); // Или любая скорость выше 250 000.
Serial.println("Test !"); // Совсем не работает.
В этом ответе на вопрос говорится, что возможна скорость 2 Мбод, поэтому я немного растерялся.
Консоль Arduino IDE предлагает различные скорости от 300 до 2 000 000 бод, так почему же не работают скорости выше 230 400?
@Thesaurus Rex, 👍5
Обсуждение2 ответа
Лучший ответ:
CHG340 поддерживает стандартные скорости передачи: 50, 75, 100, 110, 134,5, 150, 300, 600, 900, 1200, 1800, 2400, 3600, 4800, 9600, 14400, 19200, 28800, 3360. 0, 38400, 56000 , 57600, 76800, 115200, 128000, 153600, 230400, 460800, 921600, 1500000, 2000000 бод.
250 000 бод не поддерживается этой микросхемой.
Шаг в бодах составляет 200 % или 150 % от предыдущего значения (есть исключения).
Протестированные и рабочие скорости передачи данных.
Я использовал замазку в качестве последовательного монитора, так как на встроенном мониторе не были предварительно запрограммированы все скорости передачи данных.
SpeedTest.ino
// Скорость последовательного порта:
// const int Speed = 115200;
// const int Speed = 128000;
// const int Speed = 153600;
// const int Speed = 230400;
// const int Speed = 460800;
// const int Speed = 921600;
// const int Speed = 1500000;
const int Speed = 2000000;
void setup() {
// Инициализировать последовательный порт:
Serial.begin(Speed);
// Инициализировать цифровой вывод LED_BUILTIN как выход.
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
Serial.print("Speed : ");
Serial.println(Speed);
}
Это помогло мне, спасибо! На самом деле, я обнаружил, что моя проблема связана с последовательной задержкой, но мне все же удалось установить связь на скорости 1 Мбод., @Thesaurus Rex
Я проверил 3000000, которые работали для меня. См. также https://www.eevblog.com/forum/microcontrollers/ch340-usb-uart-speed-tests/, @Adam Baxter
драйвер винды идет только на 128000, @Miguel Silva
Я видел, что скорость выше 115200 «нестабильна» как в Windows, так и в Linux., @MatsK
Возможно, существует обходной путь, позволяющий этому адаптеру работать со скоростью 250 000 бод (по крайней мере, в Raspberry Pi). Автор этой статьи: http://dmxpi.blogspot.com/ 2014/04/dmx-on-raspberry-pi-start-here.html изменил драйвер Linux и утверждает, что он работает. Надеюсь, это поможет.
Пожалуйста, отредактируйте свой ответ, чтобы включить метод/шаги, используемые в ссылке. Если ссылка умрет, ваш ответ будет не таким полезным, как мог бы быть., @Greenonline
я согласен с @Greenonline, @Miguel Silva
- Можно ли загрузить скетч Arduino через последовательный порт (RX) вместо USB?
- Может ли Arduino Leonardo одновременно использовать USB-порт и последовательные контакты RX TX?
- Внешнее питание 5 В и последовательный порт USB
- Можно ли использовать Serial.print(сообщение), когда USB-кабель не подключен к хост-компьютеру?
- Как установить последовательные драйверы FTDI на Mac?
- SerialUSB на Arduino Due
- Mac не обнаруживает последовательный порт для Леонардо
- Отправлять числа в arduino через последовательный порт с помощью python
Какой тип Уно? Клон? Проверьте, какой USB-мост используется на вашей плате., @Mikael Patel
Дешевый китайский клон. Чип вроде бы CH340G., @Thesaurus Rex
CH340G не поддерживает скорость 250 Кбит/с. См. стр. 5, https://www.insidegadgets.com/wp-content/uploads/2016/12/ch340g-datasheet.pdf., @Mikael Patel
Спасибо за даташит и эту информацию. Но согласно документу должны работать скорости вроде 460 800 бод и 2 000 000 бод, так почему же это не так с моей платой?, @Thesaurus Rex
Добавьте строку «пока (!Serial);» после «Serial.begin()» или просто задержку. Квитирование USB может занять некоторое время, и первый символ будет потерян., @Mikael Patel
Пожалуйста, помните, что скорость передачи не является скоростью передачи USB. Он находится между MCU и мостом USB. Кроме того, максимальная поддерживаемая скорость передачи данных составляет прибл. 100-200 Кбит/с с реализацией Arduino HardwareSerial., @Mikael Patel
Спасибо за вашу помощь и напоминание. Мой _print()_ находится в цикле _while_, и это не проблема, если я пропущу несколько символов в начале. Что такое реализация HarwareSerial? Я вижу, что это пользовательская версия _Serial_, но для чего она нужна?, @Thesaurus Rex
Класс HardwareSerial — это реализация класса Arduino Serial, которая использует MCU/AVR UART (аппаратный последовательный порт). Класс (внутренние) управляется прерываниями и использует кольцевые буферы для хранения входящих и исходящих символов., @Mikael Patel