dlinyj: (Default)
[personal profile] dlinyj
Всё бывает в первый раз. В общем-то программирование СОМ-портов мне казалось в 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 . Треш, угар и содомия. Может быть, когда-нибудь [livejournal.com profile] di_halt получит от меня вменяемую статью, как программировать СОМ-порт в линуксе. С этого и началось моё знакомство с программированием под линукс.
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

January 2026

S M T W T F S
    123
456 78910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 22nd, 2026 10:37 am
Powered by Dreamwidth Studios