猿问

使用while循环从串口读取

我在 Go 中编写了一个简短的程序来通过串行端口与传感器通信:


package main


import (

    "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 := 0


for {

    n, _ := s.Read(buf)


    if n > 0 {

        break

    }

}


fmt.Println(string(buf[:n]))

我猜buf每次循环通过后都会被覆盖。有什么建议么?


ibeautiful
浏览 357回答 2
2回答

喵喔喔

您的问题是Read()只要有数据就会返回 - 它不会等待所有数据。有关更多信息,请参阅io.Reader 规范你想要做的是阅读直到你到达某个分隔符。我不知道您尝试使用的确切格式,但看起来可能\x0a是结束分隔符。在这种情况下,您将使用像这样的bufio.Readerreader := bufio.NewReader(s)reply, err := reader.ReadBytes('\x0a')if err != nil {    panic(err)}fmt.Println(reply)它将读取数据直到第一个\x0a.
随时随地看视频慕课网APP

相关分类

Go
我要回答