为了账号安全,请及时绑定邮箱和手机立即绑定

使用while循环从串口读取

使用while循环从串口读取

Go
ibeautiful 2021-06-16 17:06:51
我在 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.


查看完整回答
反对 回复 2021-06-21
  • 2 回答
  • 0 关注
  • 356 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信