0

このプログラムは (私が信じている) select() (ARM 用の Debian で) をそのまま適用したものです。XBEEDEVICE はシリアル ポートを指します。シリアル ポートが存在し、ic がデバイスに接続されています。

問題は、受信したデータがあっても select() が 0 を返すことです。最後の「else」を一時的にコメントアウトすると、プログラムは TIMEOUT を出力し、次にリモート デバイスから返された文字列を出力します。

int main( int argc, char **argv ) {
  int fd, c, res, n;
  struct termios oldtio, newtio;
  char buf[255] = {0};

  fd_set input;
  struct timeval timeout;

  // define timeout
  timeout.tv_sec = 5;
  timeout.tv_usec = 0;

  fd = open( XBEEDEVICE, O_RDWR | O_NOCTTY );
  if( fd < 0 ){
    perror( XBEEDEVICE );
    return( -1 );
  }

  tcgetattr( fd, &oldtio ); /* save current port settings */
  bzero( &newtio, sizeof( newtio ));
  newtio.c_cflag = CRTSCTS | CS8 | CLOCAL | CREAD;
  newtio.c_iflag = IGNPAR;
  newtio.c_oflag = 0;

  /* set input mode (non-canonical, no echo,...) */
  newtio.c_lflag = 0;

  newtio.c_cc[VTIME]    = 0;   /* inter-character timer unused */
  newtio.c_cc[VMIN]     = 2;   /* blocking read until 2 chars received */

  tcflush( fd, TCIFLUSH );
  tcsetattr( fd, TCSANOW, &newtio );

  // Sending +++ within 1 second sets the XBee into command mode
  printf( " Sending +++\n" );
  write( fd, "+++", 3 );

  n = select( fd, &input, NULL, NULL, &timeout );

  if( n < 0 )
    printf( "select() failed\n" );
  else if( n == 0 )
    printf( "TIMEOUT\n" );
  //else{
    res = read( fd, buf, 250 );
    buf[res] = 0;
    printf( "Received: %s\n", buf );
  //}
  tcsetattr( fd, TCSANOW, &oldtio );

  return( 0 );
}
4

1 に答える 1

3

inputを含むように初期化する必要がありますfd。これは、FD_ZEROおよびFD_SETマクロで実行されます。

FD_ZERO(&input);
FD_SET(fd, &input);

selectこれは、が呼び出される前に毎回行う必要があります。

の最初の引数selectfd+1. チェックする範囲内のファイル記述子の数です。範囲内の最大 (かつ唯一の) 記述子番号はfdであり、最小値は常に 0 であるため、問題の番号は ですfd+1

于 2013-02-13T04:00:44.143 に答える