Как сбросить или сбросить буферизованные данные - PullRequest
0 голосов
/ 17 апреля 2019

Невозможно сбросить или сбросить буфер.

Я пытаюсь получить данные через последовательный порт, где я получаю пакет данных некоторой фиксированной длины каждые 10 секунд. У меня есть бесконечный цикл для получения пакетов данных непрерывно. После получения нового пакета данных я сбрасываю буфер, но при получении следующего пакета данных он перезаписывает буфер, и я получаю смешанный пакет данных.

Допустим, я должен получать пакет abcdef непрерывно в течение каждой n секунды. Но когда я пробую следующий код, я получаю пакет 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 Ответ

1 голос
/ 18 апреля 2019

, имея в виду, я не могу проверить, что я здесь говорю ...

1 / вы не должны создавать экземпляр bufio reader на каждой итерации

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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...