Помогите с настройками com порта! Работаю с сетью контроллеров: в цикле поочередно посылаю каждому запрос,затем принимаю ответ (11 байт), и т.д. Как сделать чтобы программа не ждала принятия данных и не зависала, если с каким нибудь контроллером проблемы и он не отвечает?
#define BAUDRATE B9600int fd;
int res;
struct termios newtio;
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY);
cfmakeraw(&newtio);
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_ofalg = 0;
newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
newtio.c_cc[VTIME] = 5;
newtio.c_cc[VMIN] = 11;
res = tcsetattr(fd,TCANOW,&newtio);for(;;)
{
for(int k=1;k<=10;k++) //кол-во контроллеров
{
for(int i=0;i<5;i++)
res = write(fd,&buf_out[i],1);res = read(fd,&buf_in,11);
// ......
}
}for(
>Помогите с настройками com порта! Работаю с сетью контроллеров: в цикле поочередно
>посылаю каждому запрос,затем принимаю ответ (11 байт), и т.д. Как
>сделать чтобы программа не ждала принятия данных и не зависала, если
>с каким нибудь контроллером проблемы и он не отвечает?При открытии порта попробуй использовать опцию O_NDELAY - в этом случае при чтении из порта read не будет ждать появления данных и возвращаться сразу. Но тут есть подвох - если в ответ на write() один контроллер просто не успеет ответить, или ответит, но не всю порцию данных за раз, то эту ситуацию надо или отлавливать, или как-то по другому организовывать процесс "запрос-ответ", потому что read() вернется, и ты уже будешь опрашивать следующий контроллер.