ホームページ  >  記事  >  バックエンド開発  >  Go でシリアル ポートからノンブロックでデータを読み取る方法は?

Go でシリアル ポートからノンブロックでデータを読み取る方法は?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-02 18:38:30940ブラウズ

How to Read Data from a Serial Port Non-Blockingly in Go?

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

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