URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6513
[ Назад ]

Исходное сообщение
"настройка com порта"

Отправлено developer1 , 01-Июн-07 15:17 
Помогите с настройками com порта! Работаю с сетью контроллеров: в цикле поочередно посылаю каждому запрос,затем принимаю ответ (11  байт), и т.д. Как сделать чтобы программа не ждала принятия данных и не зависала, если с каким нибудь контроллером проблемы и он не отвечает?
#define BAUDRATE B9600

int 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 порта"
Отправлено Iceman , 01-Июн-07 18:31 
>Помогите с настройками com порта! Работаю с сетью контроллеров: в цикле поочередно
>посылаю каждому запрос,затем принимаю ответ (11  байт), и т.д. Как
>сделать чтобы программа не ждала принятия данных и не зависала, если
>с каким нибудь контроллером проблемы и он не отвечает?

При открытии порта попробуй использовать опцию O_NDELAY - в этом случае при чтении из порта read не будет ждать появления данных и возвращаться сразу. Но тут есть подвох - если в ответ на write() один контроллер просто не успеет ответить, или ответит, но не всю порцию данных за раз, то эту ситуацию надо или отлавливать, или как-то по другому организовывать процесс "запрос-ответ", потому что read() вернется, и ты уже будешь опрашивать следующий контроллер.