while ループを使用したノンブロッキング シリアル ポート読み取り
このプログラムの目標は、シリアル経由でセンサーと通信することです。データ読み取りのための time.Sleep の使用を避けながらポートを停止します。残念ながら、while ループを使用した最初の試みは、各ループ反復でデータ バッファーを上書きするために失敗しました。
解決策は、bufio.Reader の導入によって先導されたバイト指向の読み取りアプローチを実装することにあります。このストリーム指向のリーダーは、シリアル通信のためのより洗練された堅牢なメカニズムを提供します。
<code class="go">package main import ( "bufio" "fmt" "github.com/tarm/goserial" ) func main() { c := &serial.Config{Name: "/dev/ttyUSB0", Baud: 9600} s, err := serial.OpenPort(c) if err != nil { fmt.Println(err) } _, err = s.Write([]byte("\x16\x02N0C0 G A\x03\x0d\x0a")) if err != nil { fmt.Println(err) } reader := bufio.NewReader(s) reply, err := reader.ReadBytes('\x0a') // Read until a newline character is encountered if err != nil { panic(err) } fmt.Println(reply) s.Close() }</code>
この変更により、プログラムは指定された区切り文字 (この場合は x0a) に達するまで受信データを継続的に読み取ります。このアプローチにより、ブロック操作を必要とせずに信頼性の高いデータ取得が保証されます。
以上がGo でシリアル ポートからノンブロックでデータを読み取る方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。