如何重设或丢弃缓冲的数据

时间:2019-04-17 15:14:58

标签: go buffer reader

无法重置或丢弃缓冲区。

我正在尝试通过串行端口获取数据,我每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 个答案:

答案 0 :(得分:1)

请记住,我无法检查我在这里说的话...

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

2 / bufio.Reader.Peek不会使阅读器前进 https://golang.org/pkg/bufio/#Reader.Peek

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

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

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

6 /我在go中发现所有可用于串行端口的软件包都公开了io.Reader的实例,因此使用额外的bufio.Reader可能没用。我怀疑您正在使用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)
    }
}