28 сентября 2007, Alexander написал:
> Привет !
>
> Пытаюсь научиться работать с COM портом программно
> (итоговая задача: нужно снимать показания с мультиметра),
> но возникает непонятный затык.
>
> Для экспериментов я использую свой модем (тк мультиметр не мой).
> Так вот, при открытии файла порта, происходит зависание программы.
> При этом светодиод модема загорается, те в порт я попадаю.
> Работаю под рутом, с правами игрался. Не пойму в чём затык.
> Модем работает нормально.
>
> Пишу на Паскале, но и на сишном примере
> из Serial-Programming-HOWTO то же самое.
Serial Programming Guide for POSIX Operating Systems
(http://www.easysw.com/~mike/serial/serial.html) - этот? Там всё описано
адекватно.
> Пример на Си из Serial-Programming-HOWTO :
[...]
>
> /*
> Открываем модемное устройство для чтения и записи и не как терминал
> потому что нам не нужно завершение в случае появления в линии CTRL-C
> */
> fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY ); // здесь происходит
> зависание if (fd <0) {perror(MODEMDEVICE); exit(-1); }
Здесь действительно можно зависнуть если изначально нет CLOCAL и нет сигнала
CD. Поэтому нужно открывать с флагом O_NDELAY а потом его убирать через
fcntl(). В linux в отличие от sysv нет никаких умолчаний для параметров tty,
и после последнего закрытия они также не сбрасываются.
> tcgetattr(fd,&oldtio); /* сохраняем текущие настройки порта */
> bzero(&newtio, sizeof(newtio)); /* очищаем структуру под новые настройки
> */
Опять - так поступать крайне рисковано. В struct termios могут быть
неописанные, но существенные поля (и как раз в sysv они были), поэтому её
нельзя формировать с ноля - надо считывать существующую а потом её изменять.
Дальше разбирать не стал.
-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 32667; Возраст листа: 1527; Участников: 1445
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/693882