ホームページ >バックエンド開発 >Golang >区切り文字を使用して Go のシリアルポートからデータを効率的に読み取る方法は?

区切り文字を使用して Go のシリアルポートからデータを効率的に読み取る方法は?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-27 07:37:31967ブラウズ

How to Efficiently Read Data from a Serial Port in Go Using Delimiters?

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 サイトの他の関連記事を参照してください。

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