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

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