Скорость передачи устанавливается на 9600 автоматически, даже если указано другое значение.

Вы инициализируете последовательную связь через USB с помощью

Serial.begin(baudrate);

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

Одна вещь, которую я нашел странной, заключается в том, что я не могу на самом деле использовать скорость передачи данных, отличную от 9600. Скетч компилируется и загружается очень хорошо, но если я проверю фактическую скорость последовательного порта через

setserial -ag port

где port — это порт моей платы Teensy 4.0 (эту команду можно использовать в терминале Linux) или с

Serial.baud();

непосредственно в скетче всегда указано 9600. Я подозреваю, что это вызвано чем-то внутри кода Serial.begin(), так как я могу вручную установить скорость передачи через терминал в Linux, используя

stty speed baudrate < port > port

где (опять же) baudrate — это скорость, которую я хочу использовать, а port — это порт моей платы (проверка с помощью первой команды терминала: работает). Но при перезапуске программы на плате скорость возвращается к 9600.

Кто-нибудь знает, почему это так и как это исправить?

, 👍1


2 ответа


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

3

Вся концепция скорости передачи в бодах при USB-соединении совершенно бессмысленна. Не существует такой вещи, как "скорость передачи данных" через USB.

То, что есть и что вы путаете со «скоростью передачи», — это элемент конфигурации, который хост может отправить на устройство, которое является элементом конфигурации «Я хочу, чтобы вы обменивались данными с другими устройствами на этой скорости».

Это предназначено для использования с адаптерами USB-UART, где оно используется для настройки скорости передачи физического интерфейса UART для нисходящей связи.

Когда вы устанавливаете скорость передачи в своем коде, она игнорируется, так как не имеет значения.

Когда вы устанавливаете скорость передачи данных на своем компьютере, он отправляет ее как это значение конфигурации, которое вы можете затем получить, если вас интересует это значение, с помощью функции Serial.baud() .

,

Конечно, есть скорость передачи данных по USB. Существует один для каждого сообщения. Вы хотите сказать, что Arduino IDE не может это изменить?, @LukasFun

@LukasFun Нет, скорости передачи нет. Существует скорость передачи данных, но она в значительной степени не связана с фактической скоростью связи между хостом и каким-либо одним устройством, поскольку это протокол на основе пакетов., @Majenko

Итак... как вы тогда контролируете скорость передачи данных USB-соединения, я думаю? И почему эта скорость не имеет значения?, @LukasFun

Вы не контролируете скорость передачи данных. Скорость передачи данных определяется классом интерфейса и устройства. USB 1 («Полная скорость») — 12 Мбит/с. USB 2 («высокая скорость») — 480 Мбит/с. USB 3 («Суперскорость») — 5 Гбит/с. Выбранная скорость является максимальной, на которой устройство (Arduino) и хост (компьютер) могут работать вместе., @Majenko

Эта скорость передачи данных делится между всеми устройствами на шине., @Majenko

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

Итак, это означает, что на родном USB Arduino скорость передачи данных для связи через USB не имеет никакого влияния?, @chrisl

Правильный. Параметр, указанный в Serial.begin(...), полностью игнорируется., @Majenko

Извините, что снова возвращаюсь к этому. Хотя скорость передачи данных USB-порта сама по себе может быть фиксированной, это не означает, что последовательный порт на самом деле делает то, что мне нужно (общается с максимальной скоростью). Это связано с тем, что последовательный порт, используемый для этой связи, эмулируется только через порт USB. И подключение этого _эмулированного_ порта должно быть настраиваемым. На самом деле это так, как я указал в своем вопросе, но сбрасывается каждый раз, когда контроллер запускает скетч. Есть ли способ изменить скорость соединения? Я на самом деле проверил скорость, и она составила около 60000 бит/с. Довольно медленно., @LukasFun

@LukasFun Порт работает на максимально возможной скорости. Это не фиксированная скорость, но данные передаются настолько быстро, насколько позволяет канал USB. Скорость «сбрасывается», потому что каждый раз, когда скетч запускается, порт CDC/ACM уничтожается и создается заново. По сути, это совершенно новое устройство, поэтому оно получает системные настройки по умолчанию. Но поскольку эта «скорость передачи» не имеет значения, ее изменение не имеет значения., @Majenko

«Скорость передачи данных» иногда используется для того, чтобы заставить устройство делать разные вещи — например, изменение скорости передачи данных на 1200 может привести к сбросу Arduino в загрузчик для программирования. Я использую 300 бод на устройстве, которое я продаю, чтобы войти в режим специального протокола низкоуровневого программирования., @Majenko

Полученная вами скорость зависит от многих факторов: что еще находится на той же шине USB, насколько мощное целевое устройство (насколько быстро оно может обрабатывать USB-пакеты по мере их поступления) и т. д., @Majenko

Другими словами: забудьте, что вы используете Arduino, и представьте, что это адаптер FT232. Когда вы устанавливаете скорость передачи данных, вы не устанавливаете скорость передачи данных USB-соединения. Вы сообщаете FT232 скорость передачи данных, которую вы хотели бы, чтобы *он* связывал со всем, к чему он подключен., @Majenko

вы думаете об этом исключительно с точки зрения USB? конечно, сама последовательная (то есть: RS232) связь, которую генерирует USB, должна иметь определенную скорость передачи данных, чтобы иметь возможность правильно взаимодействовать с устройствами. последовательная связь не может быть быстрее, чем ожидает устройство, иначе она не будет принята должным образом., @Dave Cousineau


0

Как предположил LukasFun, проблема может заключаться в управлении потоком. Очевидно, что низкоскоростное устройство RS232 не сможет обрабатывать непрерывный поток данных со скоростью 1,5 Мбит/с.

Быстрый просмотр этого документа может помочь. https://www.usconverters.com/index.php?main_page=page& id=49&chapter=0

,