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!