metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-04-23 11:15 am

Свежее чертово вуду с /dev/ttyS*

Есть несколько прог, работающих с ком-портом:
minicom - полноценный терминал, понимает модемы, куча настроек и прочая.
microcom - тупой минимизированный терминал.
stty - родная прога для управления параметрами терминала
cat /dev/ttyS0 и echo -e "CHERVIE\r" >/dev/ttyS0
и моя софтина для управления железом.

И имеется такой симптом: иногда после запуска minicom порт превращается в такую тыкву, что open("/dev/ttyS0", O_RDWR) виснет. Соответственно, microcom, cat и моя прога виснут. minicom и stty - нет.
Если поменять настройки порта с помощью stty - начинают работать опять:
stty -F /dev/ttyS0 ispeed 115200 ospeed 115200 -echo -parenb cs8 -crtscts -ixon -ixoff clocal cread icanon icrnl ignpar
Похоже, что основная проблема в настройке clocal - если этот флаг установлен, все работает, иначе открытие виснет.
Заглянул в исходники minicom - делают чертовейшее вуду. Открывают порт с O_NDELAY, затем сбрасывают этот флаг. И далее, получив рабочий дескриптор файла - меняют его настройки.

PS: И вот как бы это следующее найти в мане, а не в гугле:
The O_NDELAY flag tells UNIX that this program doesn't care what state the DCD signal line is in - whether the other end of the port is up and running. If you do not specify this flag, your process will be put to sleep until the DCD signal line is the space voltage.

[identity profile] http://users.livejournal.com/_slw/ 2012-04-23 08:20 am (UTC)(link)
а где вуду?

[identity profile] metaclass.livejournal.com 2012-04-23 08:25 am (UTC)(link)
Невозможность открыть порт без извращений с O_NDELAY
Т.е., я же еще с портом ничего не делаю, я только хочу его открыть и далее уже менять настройки через tcsetattr
Но при этом настройки влияют на возможность открыть порт вообще.

[identity profile] http://users.livejournal.com/_slw/ 2012-04-23 08:29 am (UTC)(link)
это, разумеется, правильное поведение.

[identity profile] metaclass.livejournal.com 2012-04-23 08:34 am (UTC)(link)
Если у этого нет внятного объяснения - это безумие. "Пилить сук на котором сидим".

[identity profile] http://users.livejournal.com/_slw/ 2012-04-23 08:35 am (UTC)(link)
clocal описание не читал ты, чую я!

[identity profile] metaclass.livejournal.com 2012-04-23 08:43 am (UTC)(link)
man termios
CLOCAL Ignore modem control lines.

man stty
[-]clocal
disable modem control signals

все :)

Edited 2012-04-23 08:43 (UTC)

[identity profile] metaclass.livejournal.com 2012-04-23 08:46 am (UTC)(link)
The O_NDELAY flag tells UNIX that this program doesn't care what state the DCD signal line is in - whether the other end of the port is up and running. If you do not specify this flag, your process will be put to sleep until the DCD signal line is the space voltage.

Ясно, объяснение все таки есть.

[identity profile] http://users.livejournal.com/_slw/ 2012-04-23 09:11 am (UTC)(link)
чтени пары толстых книжек все же необходимо.
возможно, что два раза по паре -- две по юниксу и две по RT-11/VMS.

очень многое терминальное пошло из RT-11 (и в тамошних юзер-гайдах хорошо документированно), но вот где оно документированно в современной документации -- я даже не представляю. например, Control-O.
у меня-то пальцы и спинной мозг помнит, а остальным как?