package shared import ( "errors" "github.com/goburrow/serial" "io" "time" ) // receive the requested number of bytes from serial port and stop after the given timeout in seconds func ReceiveBytes(port *serial.Port, count int, timeout time.Duration) ([]byte, error) { timeoutCh := time.After(timeout * time.Second) readCh := make(chan []byte, 1) errCh := make(chan error, 1) go func() { data := make([]byte, count) if _, err := io.ReadAtLeast(*port, data, count); err != nil { errCh <- err } else { readCh <- data } }() select { case <-timeoutCh: return nil, errors.New("timeout") case err := <-errCh: return nil, err case data := <-readCh: return data, nil } }