Select () всегда блокирует / dev / ttyUSB0 - PullRequest
0 голосов
/ 27 сентября 2011

я использую функцию Select () в rf-модуле XBee, который находится на /dev/ttyUSB0. Но этот syscal просто не возвращает (возвращает только по таймауту), но если я использую read () в цикле WHILE на этом порту, я можно увидеть данные приходящие

 /*code to open the port*/
 system("stty -F /dev/ttyUSB0 5:0:8bd:0:3:1c:7f:15:1:64:0:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0");
fd = open("/dev/ttyUSB0", O_RDWR  );
printf("fd is %d",fd);
if(fd == -1)
    return ERR_PORT;

select возвращается только тогда, когда TIMEOUT отсутствует, когда порт готов к чтению

FD_ZERO (&set);
FD_SET (fd, &set);//fd is an opened file des. for /dev/ttyUSB0
struct timeval timeout;
timeout.tv_sec = 50;
timeout.tv_usec = 0;

if(select(FD_SETSIZE,&set, NULL,NULL,&timeout)==1)
  Do_stuff();
else
  return TIMEOUT;

но если я использую следующее, я вижу распечатываемые данные

char ch;
while(1)
{
 read(fd,&ch,1);
printf("\n0x%X",ch);
}

Обратите внимание: о команде в функции system() я получил ее, выдав stty -F /dev/USB0 -g после того, как GTKterm был открыт на /dev/ttyUSB0 (то есть, когда я смог поговорить с моим модемом из моей программы), поэтому сделал предположение что GTKterm настроил порт, и я использовал точно такую ​​же конфигурацию.

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Если вы используете select () в цикле (я полагаю, вы делаете это), позаботьтесь о том, чтобы установить fd_set () и tv_sec, tv_usec на каждой итерации цикла , также: ваш формат printf не поддерживаетзаканчивается на \ n, поэтому вывод не будет сброшен.Вместо этого он начинается с \ n, поэтому он будет очищен до того, как появится соответствующий вывод.

1 голос
/ 27 сентября 2011

Первый аргумент select() - это самый высокий дескриптор файла в наборе плюс один. Ваше заявление должно быть:

if (select(fd + 1,&set, NULL,NULL,&timeout) == 1)
{
   ...
}

РЕДАКТИРОВАТЬ : Также вы предполагаете, что если select() не возвращает 1, это связано с проблемой тайм-аута, которая имеет значение true, только если возвращается 0. Проверьте возврат -1 и сообщите значение errno. Также убедитесь, что дескриптор файла находится в неблокирующем режиме.

...