Главная страница


ru.unix.bsd

 
 - RU.UNIX.BSD ------------------------------------------------------------------
 From : Valentin Nechayev                    2:5020/400     05 Dec 2003  02:31:37
 To : Andrey Nebogin
 Subject : Re: Программирование, rs232, исходник
 -------------------------------------------------------------------------------- 
 
 
 >>> Andrey Nebogin wrote:
 
 AN>         fd = open( "/dev/cuaa1", O_RDWR | O_NOCTTY | O_NDELAY );
 
 O_NOCTTY не нужен для BSD, хотя нужен для переносимости.
 O_NDELAY в классике - совсем не то. Тебе нужен O_NONBLOCK.
 Hа FreeBSD они одинаковы, но при переносе будет диверсия.
 
 Кстати, на cua устройстве вообще нет разницы, есть nonblock или нет
 в момент открытия устройства.
 
 AN>         if( fd > 0 )
 
 if( fd != -1 )
 а у тебя какая-то совершенно левая проверка. А вообще лучше было сделать
 так:
   if( fd == -1 )
    err( 1, "open(port" );
 оно сразу и ошибку расскажет. (Hе забыть #include <err.h>)
 
 AN>         {
 AN>                 fcntl( fd, F_SETFL, 0 );
 
 Hу предположим. Хотя в идеале надо читать текущий состав флагов
 и сбрасывать только один.
 
 AN>                 tcgetattr( fd, &options );
 AN>                 cfsetispeed( &options, B57600 );
 
 А чего только входящая скорость? Исходящая тебя устраивает какая была?
 
 AN>                 options.c_cflag |= ( CLOCAL | CREAD | CS8 );
 AN>                 options.c_cflag &= ~( PARENB | CSTOPB | CSIZE );
 AN>                 options.c_lflag &= ~( ICANON | ECHO | ECHOE | ISIG);
 AN>                 options.c_oflag &= ~OPOST;
 
 cfmakeraw() могло бы быть удобнее по крайней мере для части действий.
 
 AN>                 for( tries=0; tries<3; tries++ )
 
 Вот здесь начинаются самые большие чудеса. К сожалению, задача такая,
 что для нормальной её реализации нужен алгоритм примерно следующего вида:
 
   до_посинения {
    если можно читать - прочитать и сложить в буфер;
    если в буфере сложилось что-то осмысленное - интерпретировать;
    если данные в буфере начинаются с того, что явно не имеет
       смысл - выбросить это начало данных;
    если есть что писать из выходного буфера -
       попробовать записать;
    спать пока не ( рак свистнул
        или
        можно прочитать из порта и есть во входном
           буфере место куда читать
        или
        можно записать в порт и в выходном буфере
           есть данные чтобы писать
             )
   }
 
 у тебя же могут в текущем варианте данные поступать по частям - например,
 разорвался ответ станции пополам, в первый read() половина и в следующий
 половина. А ты не сможешь собрать их в один и обработать.
 -netch-
 --- ifmail v.2.15dev5.1
  * Origin: Dark side of coredump (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Программирование, rs232   Andrey Nebogin   04 Dec 2003 13:28:44 
 Программирование, rs232   Vladimir Kurtukov   04 Dec 2003 17:52:58 
 Re: Программирование, rs232   Alexander Anistratenko   04 Dec 2003 17:15:50 
 Программирование, rs232   Vassily Kiryanov   04 Dec 2003 16:36:21 
 Re: Программирование, rs232, исходник   Andrey Nebogin   04 Dec 2003 15:43:22 
 Re: Программирование, rs232, исходник   Vadym Fedchuk   04 Dec 2003 16:00:34 
 Re: Программирование, rs232, исходник   Andrey Nebogin   04 Dec 2003 16:39:25 
 Re: Программирование, rs232, исходник   Vadym Fedchuk   04 Dec 2003 17:37:14 
 Re: Программирование, rs232, исходник   Victor Abramov   04 Dec 2003 16:18:34 
 Программирование, rs232, исходник   Vassily Kiryanov   04 Dec 2003 18:41:50 
 Re: Программирование, rs232, исходник   Valentin Nechayev   05 Dec 2003 02:31:37 
 Re: Программирование, rs232, исходник   Valentin Davydov   08 Dec 2003 10:48:51 
 Re: Программирование, rs232   Victor Abramov   04 Dec 2003 16:04:14 
 Программирование, rs232   Yurik Hashev   04 Dec 2003 17:58:40 
 Re: Программирование, rs232   Alexander Kolesnikoff   07 Dec 2003 20:10:22 
Архивное /ru.unix.bsd/736838131695.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional