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