Скорость передачи UART настраивается с помощью `screen`, но не` stty`

1064
Dmitry Grigoryev

У меня есть адаптер USB к последовательному порту, основанный на чипе CH340G . Он подключен к устройству, которое периодически отправляет строку со скоростью 9600 бод. Тем не менее, я, кажется, могу получать данные независимо от того, как я настраиваю UART stty(версия 8.13):

# stty -F /dev/ttyUSB0 9600  # stty -F /dev/ttyUSB0  speed 9600 baud; line = 0; kill = ^H; min = 100; time = 2; -icrnl -imaxbel -opost -onlcr -isig -icanon -echo # stdbuf -i0 -o0 cat /dev/ttyUSB0 data data data ^C # stty -F /dev/ttyUSB0 115200 # stty -F /dev/ttyUSB0  speed 115200 baud; line = 0; kill = ^H; min = 100; time = 2; -icrnl -imaxbel -opost -onlcr -isig -icanon -echo # stdbuf -i0 -o0 cat /dev/ttyUSB0  data data data ^C 

Я полагаю, что-то не так stty, так screenкак работает, как ожидалось. screen /dev/ttyUSB0 9600показывает данные, а screen /dev/ttyUSB0 115200не выводит.

Что-то мне не хватает в попытке настроить скорость передачи UART stty?

0

1 ответ на вопрос

2
sawdust

Я полагаю, что-то не так с stty...
...
Что-то мне не хватает в попытке настроить скорость UART с помощью stty?

Да, ваш тест некорректен, так что вы не обнаружите, что скорость передачи была изменена.

Некоторые (возможно, неясные) факты:

  • Последовательный порт может вообще не принимать данные, когда данные отправляются со скоростью передачи данных, значительно меньшей по сравнению с его конфигурацией (например, отправляются со скоростью 9600 бод и получают со скоростью 115200 бод).
  • Команда cat имеет причуду, которая может привести к тому, что она не сбрасывает буферы stdio, если не встретит символ завершения строки. IOW последовательные команды cat могут отображать те же данные, когда не было завершения строки. Принятый ответ на этот вопрос намекает на этот вопрос.

Ваш конкретный выбор и последовательность команд оболочки работают вместе, чтобы помочь вам сделать неверный вывод.

# stty -F / dev / ttyUSB0 9600
# stty -F / dev / ttyUSB0
# cat / dev / ttyUSB0
данные данные данные
^ C

Таким образом, вы настраиваете последовательный терминал с надлежащей скоростью передачи и получаете некоторые данные.

# stty -F / dev / ttyUSB0 115200
# stty -F / dev / ttyUSB0
# cat / dev / ttyUSB0
данные данные данные
^ C

После перенастройки с гораздо более высокой скоростью передачи данных последовательный порт, вероятно, перестает обнаруживать допустимые кадры, и новые данные не принимаются.
Когда вы запускаете другую команду cat, вы видите отображение тех же данных, которые были получены ранее (то есть до изменения скорости передачи).


добавление

Вы должны быть в состоянии, по крайней мере, убедить себя, что команда stty не нарушена и действительно изменяет скорость передачи данных, как и ожидалось.
Или:

О. Вместо того, чтобы переключаться на очень быструю скорость передачи (которая не может обнаружить кадрирование), переключитесь на умеренную скорость 38400 бод или более медленную скорость 4800 бод, каждая из которых должна вызывать прием / отображение мусорных символов (вместо действительных данных или ничего).

Или же

Б. Поменяйте местами порядок скорости передачи. Сбросьте системы и используйте stty для первоначальной настройки быстрой недопустимой скорости передачи данных, чтобы вызвать либо прием / отображение мусорных символов, либо ничего.
Затем используйте stty для настройки правильной скорости передачи и начните получать данные, как и ожидалось.

Спасибо, но у меня есть завершение строки (например, представьте, что данные являются строками NMEA), и даже если бы я этого не сделал, буферизация строки не позволила бы `cat` показывать какие-либо данные вообще. Я не могу себе представить, что может вызвать `cat` для отображения старых данных, так как до того, как я открою устройство, нет буфера для хранения этих данных. Dmitry Grigoryev 7 лет назад 0
Я сделал новый тест, который, надеюсь, исключает проблемы с буферизацией. Dmitry Grigoryev 7 лет назад 0
Ваш вопрос меня заинтриговал, потому что на прошлой неделе я столкнулся с похожими проблемами устаревших данных при использовании адаптера USB-to-serial и команды ** cat **. Очевидно, у меня нет правильного объяснения, и я не смог его воспроизвести. Но см. Приложение выше. sawdust 7 лет назад 0
Спасибо! Я собираюсь протестировать несколько других [адаптеров UART] (http://arduino.stackexchange.com/q/32035/13327), когда я их получу, но вы дали мне идею: я передам свой тест с Arduino запрограммирован на вывод последовательного входа на выход. Dmitry Grigoryev 7 лет назад 0

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