?

Log in

No account? Create an account
  Journal   Friends   Calendar   User Info   Memories
 

Электронный миссионер

20th August, 2018. 6:59 pm. Великий и могучий СОМ-порт

Всё бывает в первый раз. В общем-то программирование СОМ-портов мне казалось в Linux тривиальной задачей, уже была заготовка, которая кочевала со мной из проекта в проект и успешно работала.
Тут понадобилось работать с RS-485 (читай тот же СОМ-порт). Только данные были сырыми, без текста. И столкнулся с тем, что всё работает как-то "странно".

Я спрашивал в разных местах, телеграммовских чатах, и сообществе нашем любимом. Суть была такова, что в какой-то момент всё нахрен высыпалось и переставало работать или вообще не начинало.

Но! Точно как в анекдоте:
Поймали трех индейцев: вождя, просто индейца, и индейца по прозвищу Орлиныи Глаз. Заперли в сарай. Через несколько дней смотрят, а они сбежали. Индейцев опять поймали и спрашивают, как им удалось сбежать. Вождь говорит:
- Сидим мы день, сидим другой, а на третий день Орлиный Глаз заметил, что у сарая одной стены не хватает.


Короче, отлаживаю СОМ-порт программой cutecom и в нём все посылки идут и получаю. И ВНЕЗАПНО заметил, что после запуска cutecom моя программа работает как часы! Это тот "мифический" эффект, когда то работает, то нет. Тэээкс! Значит прога ставит какие-то флаги, которые моя программа не ставит. Тут на помощь пришла удивительная утилита, называемая stty! Решение гениально и простое. Получаем параметры порта ДО запуска cutecom, после инициализации моей программой и после запуска. Смотрим разницу:

stty -a -F /dev/ttyUSB0 > first
cutecom^C
stty -a -F /dev/ttyUSB0 > second
diff first second


К сожалению дифы я уже стёр, да это и не очень принципиально важно. Важно другое, что там есть разные флаги. И я взял мануал по termios и тупо прошерстил все флаги. Как я понял, т.к. я всегда работал с текстовыми данными, всяких спец-символов, которые генерирует у меня сигнал не было. А в хексах они появились и сильно портили мне малину. В результате две строки:
 options.c_iflag |= IGNBRK;
 options.c_lflag &= ~ISIG;


Точно исправили все мои беды.

Я всё это толкую к тому, что если в вашей программе работы с СОМ-портом нихера не работает, а в программе соседа работает, то проверьте stty что там и как. Проблема только в том, что истинные перцы восстанавливают режим работы порта, который был до запуска, но это редко.

А вообще, СОМ-порт в линуксе - это какая-то адовая жесть. Он разве что щи не варит. Проблема в том, что СОМ-порт там нифига не порт, а консоль, и там в результате этого куча всевозможных свистоперделок накручено. Достаточно глянуть программу пример тестирования порта https://github.com/cbrake/linux-serial-test/blob/master/linux-serial-test.c . Треш, угар и содомия. Может быть, когда-нибудь di_halt получит от меня вменяемую статью, как программировать СОМ-порт в линуксе. С этого и началось моё знакомство с программированием под линукс.

Read 4 Notes -Make Notes

Back A Day - Forward A Day