Maison > développement back-end > Golang > Comment obtenir une lecture continue des données du port série à l'aide d'une boucle While en Go ?

Comment obtenir une lecture continue des données du port série à l'aide d'une boucle While en Go ?

DDD
Libérer: 2024-10-27 16:28:28
original
1033 Les gens l'ont consulté

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

Utiliser une boucle While pour lire en continu des données à partir d'un port série

Lors de l'interaction avec des capteurs ou des appareils via des ports série, il est souvent nécessaire pour lire les données entrantes en continu. Dans ce contexte, la question se pose : comment y parvenir à l'aide d'une boucle while ?

Considérons un exemple de programme Go utilisé pour la communication série :

<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>
Copier après la connexion

Dans cet extrait, la tentative initiale créer une boucle while pour une lecture continue ne fonctionne pas comme prévu. Contrairement à une fonction Read() bloquante, la méthode Read() du package série renvoie immédiatement, même si aucune donnée n'est disponible. Ce comportement entraîne l'écrasement du tampon et l'incapacité de capturer toutes les données entrantes.

Pour résoudre ce problème, une approche plus robuste consiste à utiliser un bufio.Reader, qui fournit des capacités de mise en mémoire tampon. En utilisant un lecteur avec un délimiteur défini (par exemple, "x0a" pour un caractère de nouvelle ligne), on peut lire en continu jusqu'à ce que le délimiteur soit rencontré.

Voici un extrait de code modifié qui intègre cette approche :

<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>
Copier après la connexion

En intégrant ce changement, le programme peut désormais lire les données entrantes de manière continue et fiable, quel que soit le débit du flux de données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal