等待 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中文網其他相關文章!