无法重置或丢弃缓冲区。
我正在尝试通过串行端口获取数据,在该串行端口中,我每 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)
}
}