我在 Go 中编写了一个简短的程序来通过串行端口与传感器通信:package mainimport ( "fmt" "github.com/tarm/goserial" "time")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) } time.Sleep(time.Second/2) buf := make([]byte, 40) n, err := s.Read(buf) if err != nil { fmt.Println(err) } fmt.Println(string(buf[:n])) s.Close()}它工作正常,但在写入端口后,我必须等待大约半秒钟才能开始读取它。我想使用 while 循环而不是time.Sleep读取所有传入的数据。我的尝试不起作用:buf := make([]byte, 40)n := 0for { n, _ := s.Read(buf) if n > 0 { break }}fmt.Println(string(buf[:n]))我猜buf每次循环通过后都会被覆盖。有什么建议么?
2 回答
喵喔喔
TA贡献1735条经验 获得超5个赞
您的问题是Read()
只要有数据就会返回 - 它不会等待所有数据。有关更多信息,请参阅io.Reader 规范
你想要做的是阅读直到你到达某个分隔符。我不知道您尝试使用的确切格式,但看起来可能\x0a
是结束分隔符。
在这种情况下,您将使用像这样的bufio.Reader
reader := bufio.NewReader(s)
reply, err := reader.ReadBytes('\x0a')
if err != nil {
panic(err)
}
fmt.Println(reply)
它将读取数据直到第一个\x0a.
- 2 回答
- 0 关注
- 356 浏览
添加回答
举报
0/150
提交
取消