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

问题描述 投票:-1回答:1

无法重置或丢弃缓冲区。

我试图通过串口获取数据,我每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)
    }
}

如何有效地重置或丢弃缓冲区数据,以便我将收到确切的数据包。

go buffer reader
1个回答
1
投票

记得我不能检查我在这说什么...

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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.