Heim >Backend-Entwicklung >Golang >Wie lese ich mithilfe von Trennzeichen effizient Daten von einem seriellen Port in Go?

Wie lese ich mithilfe von Trennzeichen effizient Daten von einem seriellen Port in Go?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-27 07:37:31965Durchsuche

How to Efficiently Read Data from a Serial Port in Go Using Delimiters?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn