Heim >Backend-Entwicklung >Golang >Wie lese ich mithilfe von Trennzeichen effizient Daten von einem seriellen Port in Go?
Warten auf Eingabe mit seriellen Ports in Go
Sie versuchen, mit Go über einen seriellen Port mit einem Sensor zu kommunizieren. Ihre aktuelle Implementierung umfasst einen Aufruf von time.Sleep, um nach dem Schreiben auf den Port eine Verzögerung zu erzielen, bevor ein Leseversuch unternommen wird. Diese Methode ist nicht optimal und Sie suchen nach einer Alternative mit einer While-Schleife zum kontinuierlichen Lesen von Daten.
Das Problem mit Ihrer Schleife
Das Problem mit der Die von Ihnen bereitgestellte while-Schleife besteht darin, dass Read alle verfügbaren Daten zurückgibt, auch wenn diese unvollständig sind. Folglich wird buf wahrscheinlich bei jeder Schleifeniteration überschrieben.
Lösung: Verwendung eines trennzeichenbasierten Ansatzes
Anstatt sich auf eine Verzögerung zu verlassen, können Sie Daten lesen, bis Sie stoßen Sie auf ein bestimmtes Trennzeichen, das das Ende der Nachricht angibt. In Ihrem Fall scheint x0a als Trennzeichen zu dienen.
Zu diesem Zweck können Sie einen bufio.Reader wie folgt verwenden:
<code class="go">package main import ( "fmt" "github.com/tarm/goserial" "bufio" ) func main() { // Establish serial port connection c := &serial.Config{Name: "/dev/ttyUSB0", Baud: 9600} s, err := serial.OpenPort(c) if err != nil { fmt.Println(err) } // Write to the port _, err = s.Write([]byte("\x16\x02N0C0 G A\x03\x0d\x0a")) if err != nil { fmt.Println(err) } // Create a bufio.Reader for delimited reading reader := bufio.NewReader(s) // Read data until the delimiter is encountered reply, err := reader.ReadBytes('\x0a') if err != nil { panic(err) } // Print the received message fmt.Println(reply) s.Close() }</code>
Dieser Ansatz liest kontinuierlich Daten aus den seriellen Port, bis er auf das Trennzeichen trifft, was eine effizientere und zuverlässigere Möglichkeit zum Abrufen eingehender Nachrichten bietet.
Das obige ist der detaillierte Inhalt vonWie lese ich mithilfe von Trennzeichen effizient Daten von einem seriellen Port in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!