title: Programming Linux serial port, ttyS0
body: <p>I'm trying to learn how to program the ttyS0 serial port in Linux using C.  I have another machine connected to my serial port sending alternating hex values of 5f and 6f about every two seconds.  I've verified with other port monitoring apps that these values are appearing at the port.  In my code I'm using a blocking <strong>read()</strong> into a 10 char length buffer.  Even though my other machine is still sending data, <strong>read()</strong> blocks forever.  If I include the line <strong>fcntl(fd, F_SETFL, FNDELAY);</strong> which sets read() to non-blocking read() always returns with a value of -1, meaning no data was in the UART buffer, and my for loop code just prints out random values that are in the buffer.  So in short my assumption is that my code is not reading ttyS0 and I have no idea why.  Below is my code, hopefully someone will see what's causing my problem and set me straight.  By the way, I'm using Scientific Linux, I believe ttyS0 is com port 1, as it is in RedHat and Fedora. Aslo below is the output when i run the code.  It seems to be writing to the COM port with no problems, but for a read it says its unavailable.  Also it's clear that the buffer I'm printing out is just random values not data that's been read in.  Thanks</p>
  
  <h2>console output</h2>
  
  <pre><code>hello world
  hi again
  write error: : Success
   wrote 4 bytes
  number of bytes read is -1
  read error:: Resource temporarily unavailable
  4  8  120  -99  -73  -65  41  -120  4  8  
  should of put something out
  </code></pre>
  
  <h2>Code</h2>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;string.h&gt;
  #include &lt;fcntl.h&gt;
  #include &lt;errno.h&gt;
  #include &lt;termios.h&gt;
  #include &lt;unistd.h&gt;
  
  int main()
  {
      printf("hello world\n");
      int n;
      int fd;
      char c;
      int bytes;
  
      char buffer[10];
      char *bufptr;
      int nbytes;
      int tries;
      int x;
      struct termios options;
  
  
      fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);
      if(fd == -1)
      {
          perror("open_port: Unable to open:");
      }
      else
      {
          fcntl(fd, F_SETFL, 0);
          printf("hi again\n");
      }
  
      tcgetattr(fd, &amp;options);
  
      cfsetispeed(&amp;options, B115200);
      cfsetospeed(&amp;options, B115200);
      options.c_cflag |= (CLOCAL | CREAD);
      options.c_cflag &amp;= ~PARENB;
      options.c_cflag &amp;= ~CSTOPB;
      options.c_cflag &amp;= ~CSIZE;
      options.c_cflag |= CS8;
      options.c_cflag &amp;= ~( ICANON | ECHO | ECHOE |ISIG );
      options.c_iflag &amp;= ~(IXON | IXOFF | IXANY );
      options.c_oflag &amp;= ~OPOST;
  
      tcsetattr(fd, TCSANOW, &amp;options);
  
  
      write(fd, "ATZ\r",4);
      printf(" wrote\n");
      bufptr = buffer;
  
  
      fcntl(fd, F_SETFL, FNDELAY);
       bytes = read(fd, bufptr, sizeof(buffer));
      printf("number of bytes read is %d\n", bytes);
      perror ("read error:");
  
      for (x = 0; x &lt; 10 ; x++)
      {
          c = buffer[x];
          printf("%d  ",c);
      }
      close(fd);
  
      //puts(buffer[0]);
      printf("\nshould of put something out \n");
  
      return (0);
  }
  </code></pre>