Go のシリアル ポートでの入力を待機しています
Go を使用してシリアル ポート経由でセンサーと通信しようとしています。現在の実装には、ポートへの書き込み後、読み取りを試行する前に遅延させる time.Sleep の呼び出しが含まれています。この方法は最適ではないため、継続的なデータ読み取りに while ループを使用する代替方法を探しています。
ループの問題
あなたが提供した while ループは、たとえ不完全であっても、Read が利用可能なデータを返すということです。その結果、buf は各ループ反復中に上書きされる可能性があります。
解決策: 区切り文字ベースのアプローチを使用する
遅延に依存する代わりに、データが読み込まれるまでデータを読み取ることができます。メッセージの終わりを示す特定の区切り文字に遭遇します。あなたの場合、x0a が区切り文字として機能するようです。
この目的のために、次のように bufio.Reader を利用できます:
<code class="go">package main import ( "fmt" "github.com/tarm/goserial" "bufio" ) func main() { // Establish serial port connection c := &serial.Config{Name: "/dev/ttyUSB0", Baud: 9600} s, err := serial.OpenPort(c) if err != nil { fmt.Println(err) } // Write to the port _, err = s.Write([]byte("\x16\x02N0C0 G A\x03\x0d\x0a")) if err != nil { fmt.Println(err) } // Create a bufio.Reader for delimited reading reader := bufio.NewReader(s) // Read data until the delimiter is encountered reply, err := reader.ReadBytes('\x0a') if err != nil { panic(err) } // Print the received message fmt.Println(reply) s.Close() }</code>
このアプローチでは、継続的にデータを読み取ります。デリミタに達するまでシリアル ポートを継続し、受信メッセージを取得するより効率的で信頼性の高い方法を提供します。
以上が区切り文字を使用して Go のシリアルポートからデータを効率的に読み取る方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。