Go 如何重置或丢弃缓冲数据
无法重置或丢弃缓冲区 我试图通过串行端口获取数据,在串行端口中,我每10秒获取一个固定长度的数据包。我有一个无限的for循环来连续接收数据包。在收到新数据包后,我正在重置缓冲区,但当我收到下一个数据包时,它会覆盖缓冲区,我得到混合数据包 假设我应该每n秒连续接收一次数据包Go 如何重置或丢弃缓冲数据,go,buffer,reader,Go,Buffer,Reader,无法重置或丢弃缓冲区 我试图通过串行端口获取数据,在串行端口中,我每10秒获取一个固定长度的数据包。我有一个无限的for循环来连续接收数据包。在收到新数据包后,我正在重置缓冲区,但当我收到下一个数据包时,它会覆盖缓冲区,我得到混合数据包 假设我应该每n秒连续接收一次数据包abcdef。但是当我尝试下面的代码时,我收到了数据包bcdefa,然后在n秒之后cdefab然后defabc等等 package main import ( "bufio" "log" "time"
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对服务器和客户端提出一个新的问题,你到目前为止写的问题。