无法重置或丢弃缓冲区。
我试图通过串口获取数据,我每10秒获得一些固定长度的数据包。我有一个无限的for循环来连续接收数据包。收到新数据包后,我正在重置缓冲区,但是当我收到下一个数据包时,它会覆盖缓冲区并得到混合数据包。
假设我应该每n秒持续接收数据包abcdef
。但是,当我尝试以下代码时,我接收数据包bcdefa
然后在第二个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不推进读者https://golang.org/pkg/bufio/#Reader.Peek
3 /除非您收到格式错误的数据包,否则我认为您根本不需要重置。
4 /请在play.golang.org上缩进你的代码
5 /您没有检查终止的读取错误
6 /我发现可以使用串行端口的所有软件包都暴露了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)
}
}