title: Read and write serial port on Linux
body: <p>I use <code>github.com/jacobsa/go-serial/serial</code> package to work with serial port in my Go program.</p>
  
  <p>Simplified example:</p>
  
  <pre><code>options := serial.OpenOptions{
          PortName: "/dev/ttyUSB0",
          BaudRate: 115200,
          DataBits: 8,
          StopBits: 1,
          MinimumReadSize = 0,
          InterCharacterTimeout = 100,
      }       
  
  
      port, _ := serial.Open(options)
      defer port.Close()
  
      res := make([]byte, 1024)
      var err error
      var i int = 0
  
      for i == 0 {
          i, err = port.Read(res)
          if err != nil &amp;&amp; err != io.EOF {
              log.Printf("port.Read: %v", err)
              err = errors.New("I/O error")
          }
  
  }
  log.Println("Read bytes: ", i)
  
  // do something else
  </code></pre>
  
  <p>When data is not ready, we have <code>io.EOF</code> error. But, when there is connection lost, there is also <code>io.EOF</code> errror! How could I distinguish waiting for new data and disconnection? If there is no data, FOR cycle need to be continue untill timeout is reached, but if connection is lost, I need to re-open port, because it's descriptor becames wrong. What is the good practice to handle these cases? </p>