Heim >Backend-Entwicklung >Golang >Wie lese ich Daten von einem seriellen Port nicht blockierend in Go?

Wie lese ich Daten von einem seriellen Port nicht blockierend in Go?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-02 18:38:301031Durchsuche

How to Read Data from a Serial Port Non-Blockingly 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!

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