|
|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/73683846cec9.html, оценка из 5, голосов 10
|