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!