Флажок O_NONBLOCK Вы сбросили сразу после вызова функции open () - fcntl(hCom, F_SETFL, 0);.
(«Телесистемы»: Конференция 'Микроконтроллеры и их применение')

миниатюрный аудио-видеорекордер mAVR

Отправлено viiv 30 сентября 2003 г. 20:39
В ответ на: Еще вопрос??? отправлено ARM 30 сентября 2003 г. 19:24

Я долго пытался понять зачем Вам это нужно (я так не делаю). Но в каком-то смысле резон есть: если хочется сделать чтобы вызов open () был неблокируемым, а read () - блокируемым. Надо разобраться когда может быть заблокирован вызов open ().

open () блокируется потому что:
1) O_NONBLOCK флажок не стоит.
2) По всей видимости стоит "канонический" режим. См. man tcsetattr


Попробуйте так (прошу прощения, если есть ошибки - не компилировал):

int test (void)
{
struct termios old_attr;
struct termios new_attr;
int dev;
unsigned char ch;

dev = open ("/dev/ttyS1", O_RDWR | O_NOCTTY);
if (dev < 0)
return 0; /* причину не анализируем */

tcgetattr (dev, old_attr); /* сохраним значение атрибутов */
bzero (&new_attr, sizeof (new_attr));
new_attr.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
new_attr.c_iflag = IGNPAR;
new_attr.c_cc[VTIME] = 0; /* почитайте в "man tcsetattr" */
new_attr.c_cc[VMIN] = 1; /* почитайте в "man tcsetattr" */

tcflush (dev, TCIFLUSH);
tcsetattr (dev, TCSANOW, &new_attr);

ch = 0x55;
if (write (dev, &ch, 1) != 1) {
error:
tcsetattr (dev, TCSANOW, &old_attr); /* восстановим атрибуты */
close (dev);
return 0;
}

/* ждем приема символа 0x55 (при чтении блокируемся до получения любого символа) */
while (1) {
if (read (dev, &ch, 1) != 1)
goto error; /* goto плохо :( */
if (ch == 0x55)
break;
}

tcsetattr (dev, TCSANOW, &old_attr); /* восстановим атрибуты */
close (dev);

return 1; /* все хорошо */
}

Если не хотите блокироваться при чтении, то см. man select (это позволит задать время ожидания символа).

PS.

странная строка: if (hCom != 0) close(hCom);
Зачем условие (причем условие странное)?

Строка buff[1] = '\n';
не нужна.

Зачем нужен buff (исползуется же всегда только 1 байт)?


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru