title: select() call not returning when chars on port
body: <p>I have a select call that doesn't seem to detect characters on the serial port.  Is there anything I am missing?  </p>
  
  <p>If I remove the read() code that is in the block above the select will return for a while until the existing port buffer is emptied and then nothing more is detected.</p>
  
  <p>I am streaming characters to the port, and running minicom shows the continuous input stream on the port.</p>
  
  <p>Can anybody see anything wrong with this code?</p>
  
  <pre><code>int main(void)
  
  {
  
  
    int ret;
    char buf[1280];
    fd_set         m_Inputs;  // fd_set for the select call for com input
  
    int            m_maxFD;   // max FD for select() call.
  
    struct timeval tv;
  
  
  
    int fd1;
    fd1 = open("/dev/ttyXR6", O_RDWR | O_NOCTTY | O_NONBLOCK);
  
    fcntl(fd1, F_SETFL, 0);
  
    struct termios options;
  
    tcgetattr(fd1, &amp;options);  // Get the current options for the port...
  
    // Set the baud rates...
    cfsetispeed(&amp;options, B9600);
    cfsetospeed(&amp;options, B9600);
  
    // Enable the receiver and set local mode...
    options.c_cflag |= (CLOCAL | CREAD | CS8);
    options.c_cflag &amp;= ~PARENB;  // ignore parity
    options.c_cflag &amp;= ~CSTOPB;  // 1 stop bit (2 if set)
    options.c_cflag &amp;= ~CSIZE;   // clear the size bits
    options.c_cflag &amp;= ~CRTSCTS; //No hard flow control
    options.c_cflag &amp;= ~HUPCL;   //Hang Up on last Close
    options.c_cflag |= CS8;      // reset the size to 8 bits / char
    options.c_cc[VMIN]=1;
    options.c_cc[VTIME] = 1;
    options.c_oflag = 0;
    options.c_lflag = 0;       //ICANON;
    // Set the new options for the port...
    tcsetattr(fd1, TCSANOW, &amp;options);
  
    // test to make sure the characters are coming in on the port
  
    for (short i =0; i &lt; 60; i++)
    {
      ret = read(fd1, buf, 32);
      buf[ret] = '\0';
      cout &lt;&lt; buf;
      usleep(500);
    }
  
    fd_set         rfds;  // fd_set for the select call for com input
  
    FD_ZERO(&amp;rfds);
  
    FD_SET(fd1, &amp;rfds);
  
  
    cout &lt;&lt; endl &lt;&lt; "FD1 = " &lt;&lt; fd1 &lt;&lt; endl;
  
    while (1)
    {
      tv.tv_sec = 0;
  
      tv.tv_usec = 1000;
  
      ret = select(fd1 + 1, &amp;rfds, NULL, NULL, &amp;tv);
  
  
      if (ret &gt; 0)
  
      {
        ret = read(fd1, buf, 127);
        buf[ret] = '\0';
        cout &lt;&lt; buf;
      }
      usleep(500);
    }
  
    return 0;
  
  }
  </code></pre>