Великий и могучий СОМ-порт
Aug. 20th, 2018 06:59 pmВсё бывает в первый раз. В общем-то программирование СОМ-портов мне казалось в Linux тривиальной задачей, уже была заготовка, которая кочевала со мной из проекта в проект и успешно работала.
Тут понадобилось работать с RS-485 (читай тот же СОМ-порт). Только данные были сырыми, без текста. И столкнулся с тем, что всё работает как-то "странно".
Я спрашивал в разных местах, телеграммовских чатах, и сообществе нашем любимом. Суть была такова, что в какой-то момент всё нахрен высыпалось и переставало работать или вообще не начинало.
Но! Точно как в анекдоте:
Поймали трех индейцев: вождя, просто индейца, и индейца по прозвищу Орлиныи Глаз. Заперли в сарай. Через несколько дней смотрят, а они сбежали. Индейцев опять поймали и спрашивают, как им удалось сбежать. Вождь говорит:
- Сидим мы день, сидим другой, а на третий день Орлиный Глаз заметил, что у сарая одной стены не хватает.
Короче, отлаживаю СОМ-порт программой cutecom и в нём все посылки идут и получаю. И ВНЕЗАПНО заметил, что после запуска cutecom моя программа работает как часы! Это тот "мифический" эффект, когда то работает, то нет. Тэээкс! Значит прога ставит какие-то флаги, которые моя программа не ставит. Тут на помощь пришла удивительная утилита, называемая stty! Решение гениально и простое. Получаем параметры порта ДО запуска cutecom, после инициализации моей программой и после запуска. Смотрим разницу:
К сожалению дифы я уже стёр, да это и не очень принципиально важно. Важно другое, что там есть разные флаги. И я взял мануал по termios и тупо прошерстил все флаги. Как я понял, т.к. я всегда работал с текстовыми данными, всяких спец-символов, которые генерирует у меня сигнал не было. А в хексах они появились и сильно портили мне малину. В результате две строки:
Точно исправили все мои беды.
Я всё это толкую к тому, что если в вашей программе работы с СОМ-портом нихера не работает, а в программе соседа работает, то проверьте stty что там и как. Проблема только в том, что истинные перцы восстанавливают режим работы порта, который был до запуска, но это редко.
А вообще, СОМ-порт в линуксе - это какая-то адовая жесть. Он разве что щи не варит. Проблема в том, что СОМ-порт там нифига не порт, а консоль, и там в результате этого куча всевозможных свистоперделок накручено. Достаточно глянуть программу пример тестирования порта https://github.com/cbrake/linux-serial-test/blob/master/linux-serial-test.c . Треш, угар и содомия. Может быть, когда-нибудь
di_halt получит от меня вменяемую статью, как программировать СОМ-порт в линуксе. С этого и началось моё знакомство с программированием под линукс.
Тут понадобилось работать с 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 . Треш, угар и содомия. Может быть, когда-нибудь
no subject
Date: 2018-08-20 04:34 pm (UTC)no subject
Date: 2018-08-20 04:44 pm (UTC)Когда на некоторых ноутах начали попадаться пятивольтовые СОМ порты, я понял, что этот интерфейс будет иметь в новой реальности очень ограниченную совместимость и переносимость, хотя казалось бы - дубовей некуда!
no subject
Date: 2018-08-20 08:38 pm (UTC)no subject
Date: 2018-08-21 01:05 am (UTC)Вот только подумал, а ты уже написал:)