Heim > Artikel > Backend-Entwicklung > Wie lese ich Daten von einem seriellen Port nicht blockierend in Go?
Nicht blockierendes Lesen der seriellen Schnittstelle mithilfe einer While-Schleife
In diesem Programm besteht das Ziel darin, über eine serielle Schnittstelle mit einem Sensor zu kommunizieren Port und vermeidet gleichzeitig die Verwendung von time.Sleep zum Lesen von Daten. Leider scheiterte der erste Versuch mit einer While-Schleife daran, dass der Datenpuffer bei jedem Schleifendurchlauf überschrieben wurde.
Die Lösung liegt in der Implementierung eines byteorientierten Leseansatzes, der durch die Einführung von bufio.Reader vorangetrieben wurde. Dieser stromorientierte Leser bietet einen ausgefeilteren und robusteren Mechanismus für die serielle Kommunikation.
<code class="go">package main import ( "bufio" "fmt" "github.com/tarm/goserial" ) func main() { c := &serial.Config{Name: "/dev/ttyUSB0", Baud: 9600} s, err := serial.OpenPort(c) if err != nil { fmt.Println(err) } _, err = s.Write([]byte("\x16\x02N0C0 G A\x03\x0d\x0a")) if err != nil { fmt.Println(err) } reader := bufio.NewReader(s) reply, err := reader.ReadBytes('\x0a') // Read until a newline character is encountered if err != nil { panic(err) } fmt.Println(reply) s.Close() }</code>
Mit dieser Modifikation liest das Programm kontinuierlich eingehende Daten, bis das angegebene Trennzeichen (in diesem Fall x0a) erreicht wird. Dieser Ansatz gewährleistet einen zuverlässigen Datenabruf, ohne dass Blockierungsvorgänge erforderlich sind.
Das obige ist der detaillierte Inhalt vonWie lese ich Daten von einem seriellen Port nicht blockierend in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!