Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erreicht man ein kontinuierliches Lesen von Daten über die serielle Schnittstelle mithilfe einer While-Schleife in Go?

Wie erreicht man ein kontinuierliches Lesen von Daten über die serielle Schnittstelle mithilfe einer While-Schleife in Go?

DDD
DDDOriginal
2024-10-27 16:28:28896Durchsuche

How to Achieve Continuous Serial Port Data Reading Using a While-Loop in Go?

Verwendung einer While-Schleife zum kontinuierlichen Lesen von Daten von einem seriellen Port

Bei der Interaktion mit Sensoren oder Geräten über serielle Ports ist dies häufig erforderlich um eingehende Daten kontinuierlich zu lesen. In diesem Zusammenhang stellt sich die Frage: Wie kann dies mithilfe einer While-Schleife erreicht werden?

Betrachten Sie ein Beispiel für ein Go-Programm, das für die serielle Kommunikation verwendet wird:

<code class="go">package main

import (
    "fmt"
    "github.com/tarm/goserial"
    "time"
)

func main() {
    // ... (code to open the serial port and write data)

    time.Sleep(time.Second / 2)

    var buf []byte

    for {
        n, err := s.Read(buf)

        if n > 0 {
            break
        }
    }

    fmt.Println(string(buf[:n]))

    // ... (code to close the serial port)
}</code>

In diesem Snippet der erste Versuch Das Erstellen einer While-Schleife für kontinuierliches Lesen funktioniert nicht wie erwartet. Im Gegensatz zu einer blockierenden Read()-Funktion kehrt die Read()-Methode des seriellen Pakets sofort zurück, auch wenn keine Daten verfügbar sind. Dieses Verhalten führt dazu, dass der Puffer überschrieben wird und nicht alle eingehenden Daten erfasst werden können.

Um dieses Problem zu beheben, besteht ein robusterer Ansatz darin, einen bufio.Reader zu verwenden, der Pufferfunktionen bietet. Durch die Verwendung eines Lesegeräts mit einem definierten Trennzeichen (z. B. „x0a“ für ein Zeilenumbruchzeichen) kann kontinuierlich gelesen werden, bis das Trennzeichen gefunden wird.

Hier ist ein modifizierter Codeausschnitt, der diesen Ansatz beinhaltet:

<code class="go">package main

import (
    "bufio"
    "fmt"
    "github.com/tarm/goserial"
)

func main() {
    // ... (code to open the serial port and write data)

    // Create a bufio.Reader with a defined delimiter
    reader := bufio.NewReader(s)

    // Continuously read data until the delimiter is encountered
    reply, err := reader.ReadBytes('\x0a')

    // Print the received data
    fmt.Println(string(reply))

    // ... (code to close the serial port)
}</code>

Durch die Einbindung dieser Änderung kann das Programm nun eingehende Daten kontinuierlich und zuverlässig lesen, unabhängig von der Datenstromrate.

Das obige ist der detaillierte Inhalt vonWie erreicht man ein kontinuierliches Lesen von Daten über die serielle Schnittstelle mithilfe einer While-Schleife 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