如何重置或丢弃缓冲数据



无法重置或丢弃缓冲区。

正在尝试通过串行端口获取数据,在该串行端口中,我每 10 秒获取一些固定长度的数据包。我有一个无限的for循环来连续接收数据包。收到新数据包后,我正在重置缓冲区,但是当我收到下一个数据包时,它会覆盖缓冲区,并且我得到混合数据包。

假设我应该每 n 秒连续接收一次数据包abcdef。但是当我尝试以下代码时,我收到数据包bcdefa然后在 n 秒后cdefab然后defabc,依此类推

package main
import (
    "bufio"
    "log"
    "time"
    "github.com/tarm/serial"
)
func main() {
    c := &serial.Config{Name: "/dev/ttyUSB0", Baud: 57600}
    s, err := serial.OpenPort(c)
    if err != nil {
        log.Println(err)
        return
    }
    for {
        time.Sleep(time.Second / 2)
        reader := bufio.NewReader(s)
        pck, err := reader.Peek(46)
        if err != nil {
            log.Println(err)
        }
        go parse(pck)
        reader.Reset(s)
    }
}

如何有效地重置或丢弃缓冲区数据,以便接收到确切的数据包。

记住

我无法检查我在这里说什么......

1/您不得在每次迭代时实例化 bufio 读取器

2/布菲奥。Reader.Peek不会推进读者https://golang.org/pkg/bufio/#Reader.Peek

3/除非您收到格式错误的数据包,否则我认为您根本不需要重置。

4/请在 play.golang.org 缩进您的代码

5/您没有检查终止的读取错误

6/我能找到的所有在 go 中使用串行端口的软件包都公开了一个 io 实例。读者,所以使用额外的 bufio 可能没有用。读者。我怀疑你正在使用 https://godoc.org/github.com/tarm/serial#OpenPort

这可能不是最终的答案,但它应该会有所帮助。

package main
import (
    "io"
    "log"
    "time"
)
func main() {
    s, err := serial.OpenPort(c)
    if err != nil {
        log.Fatal(err)
    }
    pck := make([]byte, 46)
    for {
        time.Sleep(time.Second / 2)
        n, err := s.Read(pck)
        if err != nil {
            if err == io.EOF {
                break
            }
            log.Println(err)
        }
        pck = pck[:n]
        go parse(pck)
    }
}

最新更新