|
Я долго пытался понять зачем Вам это нужно (я так не делаю). Но в каком-то смысле резон есть: если хочется сделать чтобы вызов 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