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

DDD
Freigeben: 2024-10-27 16:28:28
Original
905 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!