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