无法重置或丢弃缓冲区。
我正在尝试通过串行端口获取数据,我每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)
}
}
如何有效地重置或丢弃缓冲区数据,以便接收准确的数据包。
答案 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)
}
}