while ループを使用してシリアル ポートからデータを継続的に読み取る
シリアル ポートを介してセンサーまたはデバイスと通信する場合、多くの場合、これが必要になります。受信データを継続的に読み取ります。このコンテキストでは、while ループを使用してこれをどのように実現するかという疑問が生じます。
シリアル通信に使用される Go プログラムの例を考えてみましょう:
<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>
このスニペットでは、最初の試行は連続読み取り用の while ループを作成することが期待どおりに機能しません。ブロッキング Read() 関数とは異なり、シリアル パッケージの Read() メソッドは、データが利用できない場合でも、すぐに戻ります。この動作により、バッファが上書きされ、すべての受信データをキャプチャできなくなります。
この問題に対処するためのより堅牢なアプローチは、バッファリング機能を提供する bufio.Reader を使用することです。定義された区切り文字 (改行文字の場合は「x0a」など) を備えたリーダーを使用すると、区切り文字に到達するまで継続的に読み取ることができます。
このアプローチを組み込んだ変更されたコード スニペットを次に示します。
<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>
この変更を組み込むことにより、プログラムはデータ ストリーム レートに関係なく、受信データを継続的かつ確実に読み取ることができるようになりました。
以上がGo で While ループを使用して連続シリアル ポート データ読み取りを実現するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。