ホームページ  >  記事  >  バックエンド開発  >  While ループを使用して Go のシリアル ポートからすべてのデータを正しく読み取る方法は?

While ループを使用して Go のシリアル ポートからすべてのデータを正しく読み取る方法は?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-26 21:29:29822ブラウズ

How to Correctly Read All Data from a Serial Port in Go with a While-Loop?

while ループを使用したシリアル ポートからの読み取り

この質問は、シリアル ポートを介してセンサーと通信するために Go で書かれたプログラムに関するものです。 。プログラムには受信データを読み取る while ループが含まれていますが、正しく機能しません。

元のコード:

<code class="go">buf := make([]byte, 40)
n := 0

for {
    n, _ = s.Read(buf)

    if n > 0 {
        break
    }
}

fmt.Println(string(buf[:n]))</code>

問題の説明:

このコードの問題は、Read() が利用可能なデータの量に関係なく、いつでも返される可能性があることです。これは、少量のデータを受信すると、次のループ反復で上書きされることを意味します。

解決策:

すべての受信データを正しく読み取るには、次のようにします。 bufio.Reader を使用して、特定の区切り文字が検出されるまでデータを読み取ることができます。この場合、区切り文字は 'x0a' であると想定されます。

修正コード:

<code class="go">reader := bufio.NewReader(s)
reply, err := reader.ReadBytes('\x0a')
if err != nil {
    panic(err)
}
fmt.Println(reply)</code>

このコードは、シリアル ポートからデータを読み取り続けます。 「x0a」区切り文字が見つかりました。結果は応答変数に保存され、出力されます。

以上がWhile ループを使用して Go のシリアル ポートからすべてのデータを正しく読み取る方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。