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


ru.unix.bsd

 
 - RU.UNIX.BSD ------------------------------------------------------------------
 From : Valentin Nechayev                    2:5020/400     11 Mar 2003  16:44:58
 To : Sergey Terekhin
 Subject : Re: -pthread and reading from port
 -------------------------------------------------------------------------------- 
 
 
 >>> Sergey Terekhin wrote:
 
 ST> Hаписана тестовая программа для работы с определенным устройством
 ST> через com порт. Проблема в следующем: с -pthread не читает из порта, 
 ST> без -pthread - читает. Подскажите плз. в чём тут может быть дело?
 
 Hу, напусти ktrace на оба варианта и сравни действия.
 Так - я не нашёл причины собственно нечтения с -pthread, хотя есть
 масса диверсий, которые просто не дадут сделать правильную диагностику.
 
 ST>     if (timeout != -1) {
 ST>   memset(tio.c_cc, 0, sizeof(tio.c_cc));
 
 Вот это полная чушь. Что ты добился сбросив их всех в 0?
 Что у тебя и intr, и quit, и erase, и kill, и все прочие управляющие
 символы равны NUL? Hу так оно начнёт бредить неизвестно чем.
 Hе трогай их. Если нужен raw mode, это делается флагами.
 А так у тебя даже _POSIX_VDISABLE не получился в этих клетках.
 
 ST>   if (fd < 0) {
 ST>    printf("Cannot open port");fflush(stdout);
 ST>    return 1;
 
 Это лучше записать как if( fd < 0 )  err( 1, "open port" );
 Заодно ещё и что за ошибка была, расскажет.
 Hе забыть #include <err.h>
 
 ST>   }
 ST>   
 ST>   mode(fd, 9600, 'E', 8, 1, 100);
 
 ST>   u_int mctl;
 
 ST>   if (ioctl(fd, TIOCMGET, &mctl) < 0)
 ST>    return 2;
 
 Опять же - вместо return 2 всяких - пиши, например, err( 1, "TIOCMGET" )
 А код ошибки из программы - тебе тут не нужен.
 
 ST>   u_char buf[258] = { 0x00 };
 ST>   size_t len = 258;
 ST>   tcflush(fd, TCIOFLUSH);
 ST>   tcdrain(fd);
 
 tcdrain() после двустороннего tcflush()? Так это пустая операция. ;)
 
 ST>   res = write(fd, buf, 1);    
 
 Записал байт равный 0.
 
 ST>   if (res == 0) {
 ST>    printf("\nShit!!!\n");
 ST>   } else {
 ST>    printf("\nReaded %d bytes\n", res);
 
 Да-а? А ситуацию ошибки ты не проверяешь?
 Hормально было бы
 
   if( res == -1 )  err( 1, "read" );
   if( res == 0 )  errx( 1, "read: eof" );
   printf("\nReaded %d bytes\n", res);
 
 ST>     if (tcgetattr(fh, &tio) < 0)
 ST>   return -1;
 ST>     if (baud != -1) {
 ST>   options = TCSAFLUSH;
 
 Я бы все эти проверки делал не на -1, а на значение, отличающееся
 от того, что было в режимах на момент чтения.
 Это даст, что при нескольких последовательных mode() с одними и теми
 же параметрами не будет сброса на каждом из них.
 
 ST>   if (cfsetospeed(&tio, baud) < 0)
 ST>       return -1;
 ST>   if (cfsetispeed(&tio, 0) < 0)
 ST>       return -1;
 ST>     }
 
 А почему 0? Лучше написать тот же baud, легче читать будет.
 -netch-
 --- ifmail v.2.15dev5
  * Origin: Dark side of coredump (2:5020/400)
 
 

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

 Тема:    Автор:    Дата:  
 -pthread and reading from port   Sergey Terekhin   11 Mar 2003 15:09:42 
 Re: -pthread and reading from port   Valentin Nechayev   11 Mar 2003 16:44:58 
Архивное /ru.unix.bsd/73683846cec9.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional