Go 如何重置或丢弃缓冲数据

Go 如何重置或丢弃缓冲数据,go,buffer,reader,Go,Buffer,Reader,无法重置或丢弃缓冲区 我试图通过串行端口获取数据,在串行端口中,我每10秒获取一个固定长度的数据包。我有一个无限的for循环来连续接收数据包。在收到新数据包后,我正在重置缓冲区,但当我收到下一个数据包时,它会覆盖缓冲区,我得到混合数据包 假设我应该每n秒连续接收一次数据包abcdef。但是当我尝试下面的代码时,我收到了数据包bcdefa,然后在n秒之后cdefab然后defabc等等 package main import ( "bufio" "log" "time"

无法重置或丢弃缓冲区

我试图通过串行端口获取数据,在串行端口中,我每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/bufio.Reader.Peek不会提升阅读器

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

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

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

6/我能找到的所有在go中使用串行端口的包都公开了io.Reader的一个实例,因此使用额外的bufio.Reader可能是无用的。我怀疑你正在使用

这可能不是一个确定的答案,但应该会有所帮助

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)
    }
}

每次循环迭代都会丢弃缓冲区。你能解释一下“在下一个数据包中,它覆盖了某个地方”是什么意思吗?
读卡器.Reset
是没有意义的-在紧接着的一行中,整个读卡器都被丢弃了。bufio.NewReader如果可能的话返回它的参数。根据您的问题描述,serial.OpenPort已经返回了一个缓冲读取器,而且由于您从未对其进行过升级,因此您可以一次又一次地获得相同的字节。我已经缩进了问题中的代码。我已经尝试过你的方法,但它没有收到完整的数据包。@Logan对服务器和客户端提出一个新的问题,你到目前为止写的问题。