0

/dev/ttyUSB0にあるXBee rfモジュールでSelect() sys calを使用していますが、このsyscalは返されません(タイムアウト時にのみ返されます)が、このポートのWHILEループでread()を使用すると、データが来る

 /*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);
}

注:関数内のコマンドについては、 GTKtermを開いた後にsystem()発行して取得しました(プログラムからモデムと通信できたときです)ので、GTKtermがポートを構成したと推測し、まったく同じものを使用しました構成。stty -F /dev/USB0 -g/dev/ttyUSB0

4

2 に答える 2

2

ループで select() を使用している場合 (使用していると思います) 、ループの反復ごとにfd_set() と tv_sec、tv_usec を設定するように注意してください。また、printf 形式が \n で終わらないため、出力はフラッシュされる。代わりに \n で始まるため、関連する出力が表示される前にフラッシュされます。

于 2011-09-27T12:02:55.533 に答える
1

の最初の引数select()は、セット内の最上位のファイル記述子に 1 を加えたものです。あなたの声明は次のとおりです。

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

編集select(): また、1 が返されない場合は、タイムアウトの問題が原因であると想定します。これは、0 が返された場合にのみ当てはまります。-1 の戻り値を確認し、 の値を報告しますerrno。また、ファイル記述子がノンブロッキング モードであることも確認してください。

于 2011-09-27T11:17:31.750 に答える