首頁  >  文章  >  後端開發  >  如何在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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn