Чтение Голанга из сериала - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь читать с последовательного порта (устройство GPS на Raspberry Pi).

Следуя инструкциям http://www.modmypi.com/blog/raspberry-pi-gps-hat-and-python

Я могу читать с оболочки, используя

stty -F /dev/ttyAMA0 raw 9600 cs8 clocal -cstopb
cat /dev/ttyAMA0

Я получаю хорошо отформатированный вывод

$GNGLL,5133.35213,N,00108.27278,W,160345.00,A,A*65
$GNRMC,160346.00,A,5153.35209,N,00108.27286,W,0.237,,290418,,,A*75
$GNVTG,,T,,M,0.237,N,0.439,K,A*35
$GNGGA,160346.00,5153.35209,N,00108.27286,W,1,12,0.67,81.5,M,46.9,M,,*6C
$GNGSA,A,3,29,25,31,20,26,23,21,16,05,27,,,1.11,0.67,0.89*10
$GNGSA,A,3,68,73,83,74,84,75,85,67,,,,,1.11,0.67,0.89*1D
$GPGSV,4,1,15,04,,,34,05,14,040,21,09,07,330,,16,45,298,34*40
$GPGSV,4,2,15,20,14,127,18,21,59,154,30,23,07,295,26,25,13,123,22*74
$GPGSV,4,3,15,26,76,281,40,27,15,255,20,29,40,068,19,31,34,199,33*7C
$GPGSV,4,4,15,33,29,198,,36,23,141,,49,30,172,*4C
$GLGSV,3,1,11,66,00,325,,67,13,011,20,68,09,062,16,73,12,156,21*60
$GLGSV,3,2,11,74,62,177,20,75,53,312,36,76,08,328,,83,17,046,25*69
$GLGSV,3,3,11,84,75,032,22,85,44,233,32,,,,35*62
$GNGLL,5153.35209,N,00108.27286,W,160346.00,A,A*6C
$GNRMC,160347.00,A,5153.35205,N,00108.27292,W,0.216,,290418,,,A*7E
$GNVTG,,T,,M,0.216,N,0.401,K,A*3D
$GNGGA,160347.00,5153.35205,N,00108.27292,W,1,12,0.67,81.7,M,46.9,M,,*66
$GNGSA,A,3,29,25,31,20,26,23,21,16,05,27,,,1.11,0.67,0.89*10
$GNGSA,A,3,68,73,83,74,84,75,85,67,,,,,1.11,0.67,0.89*1D
$GPGSV,4,1,15,04,,,34,05,14,040,21,09,07,330,,16,45,298,34*40

(я поместил несколько случайных данных)

Я пытаюсь прочитать это в Go. В настоящее время у меня есть

package main

import "fmt"
import "log"
import "github.com/tarm/serial"

func main() {
        config := &serial.Config{
                Name: "/dev/ttyAMA0",
                Baud: 9600,
                ReadTimeout: 1,
                Size: 8,
        }

        stream, err := serial.OpenPort(config)
        if err != nil {
                log.Fatal(err)
        }

        buf := make([]byte, 1024)

        for {
                n, err := stream.Read(buf)
                if err != nil {
                        log.Fatal(err)
                }
                s := string(buf[:n])
                fmt.Println(s)
        }
}

Но это печатает искаженные данные. Я подозреваю, что это связано с неправильным размером буфера или значением Size в структуре config, но я не уверен, как получить эти значения из настроек stty.

Оглядываясь назад, я думаю, что проблема в том, что я получаю поток и хочу иметь возможность перебирать строки stty, а не куски. Вот как выводится поток:

$GLGSV,3
,1,09,69
,10,017,
,70,43,0
69,,71,3
2,135,27
,76,23,2
32,22*6F

$GLGSV
,3,2,09,
77,35,30
0,21,78,
11,347,,
85,31,08
1,30,86,
72,355,3
6*6C
$G
LGSV,3,3
,09,87,2
4,285,30
*59
$GN
GLL,5153
.34919,N
,00108.2
7603,W,1
92901.00
,A,A*6A

1 Ответ

0 голосов
/ 29 апреля 2018

Структура, которую вы получаете от serial.OpenPort(), содержит указатель на открытый os.File, соответствующий открытому соединению последовательного порта. Когда вы Read() из этого, библиотека вызывает Read() для базового os.File.

Документация для этого вызова функции :

Чтение читает до len (b) байтов из файла. Возвращает количество прочитанных байтов и обнаруженную ошибку. В конце файла Read возвращает 0, io.EOF.

Это означает, что вы должны отслеживать, сколько данных было прочитано. Вы также должны отслеживать, были ли новые строки, если это важно для вас. К сожалению, базовый *os.File не экспортируется, поэтому вам будет сложно использовать такие приемы, как bufio.ReadLine(). Возможно, стоит изменить библиотеку и отправить запрос на извлечение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...