Подключение к tty-порту через C ++ завершится неудачно, если вы сначала не подключились через экран - PullRequest
0 голосов
/ 17 мая 2018

Я взял ИБП постоянного тока AUPS-A10-R11 и работаю с их API для создания некоторого программного обеспечения для мониторинга для моего хоста xen. Их API работает через USB-соединение на устройстве, которое отображается на хосте как / dev / ttyUSB #.

У меня все отлично работает, кроме одной вещи, которая меня озадачивает. При первом включении или перезагрузке хоста, к которому он подключен, я не могу связаться с устройством. Однако, если я открою экран подключения к нему:

screen /dev/ttyUSB0 9600

, а затем закройте его (ctrl + a, k), тогда он будет отлично работать до следующей перезагрузки хоста.

Кто-нибудь имеет представление о том, почему мне сначала нужно подключиться к устройству через экран? Я вставил свой код здесь: http://susepaste.org/0b8bb37f. При подключении при новой перезагрузке он останавливается в разделе «Чтение ничего» предложения if ... else. После подключения к устройству с экраном работает нормально.

Есть мысли ??

1 Ответ

0 голосов
/ 18 мая 2018

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

Такое поведение почти всегда связано с неполной инициализацией termios вашей программой.

Идеальная программа сконфигурирует последовательный терминал для своих целей и при выходе восстановит конфигурацию termios обратно к тому, как она его нашла.
Но большинство программ, включая программы эмуляции терминала, такие как minicom и, по-видимому, screen , просто оставляют свою конфигурацию termios вместо ее восстановления.
К счастью для вас, эта оставшаяся конфигурация termios заполняет недостающие фрагменты, что позволяет вашей программе получить доступ к последовательному терминалу, как и ожидалось.

Проверка «вашего» кода предполагает, что он был скопирован из принятого ответа на этот вопрос . Судя по количеству голосов, этот код, по-видимому, работает для многих людей. Однако автор признает, что он был написан до стандартов POSIX, и поэтому код не должен считаться переносимым. Другими словами, ваш пробег может отличаться.

Очевидно, вы пропустили альтернативный ответ , который соответствует POSIX. В этой программе есть проверенная конфигурация termios для блокировки неканонического режима.
Если вы предпочитаете упростить использование макроса cfmakeraw () , то вот еще один пример кода .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...