Maison  >  Article  >  développement back-end  >  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
DDDoriginal
2024-10-27 16:28:28896parcourir

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>

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>

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!

Déclaration:
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