Как преобразовать эти (шестнадцатеричные) числа в символы в Голанге? - PullRequest
0 голосов
/ 01 ноября 2019

Я получаю некоторые символы через радиочип, который я пытаюсь считывать с последовательного порта. Я могу прекрасно прочитать его в этом коде Python , который дает мне следующее:

received: counter: 2703
received: counter: 2704
received: counter: 2705

Поэтому, используя пакет go-serial , я написал некоторый код для выполнениято же самое в Go:

package main

import "fmt"
import "log"
import "github.com/jacobsa/go-serial/serial"
import "io"
import "encoding/hex"


func main() {
        // Set up options.
        options := serial.OpenOptions{
                PortName: "/dev/ttyUSB0",
                BaudRate: 9600,
                DataBits: 7,
                StopBits: 2,
                MinimumReadSize: 4,
        }

        // Open the port.
        port, err := serial.Open(options)
        if err != nil {
                log.Fatalf("serial.Open: %v", err)
        }
        defer port.Close()

        for {
                buf := make([]byte, 32)
                n, err := port.Read(buf)
                if err != nil {
                        if err != io.EOF {
                                fmt.Println("Error reading from serial port: ", err)
                        }
                } else {
                        buf = buf[:n]
                        fmt.Println("received: ", buf)
                        fmt.Println("received: ", hex.EncodeToString(buf))
                }
        }
}

Как вы можете видеть, я распечатываю полученный буфер как в необработанном виде, так и в преобразованном из шестнадцатеричного в строку. Результат таков:

received:  [99 111 117 110 116 101 114 58 32 51 48 50 52 10]
received:  636f756e7465723a20333032340a
received:  [99 111 117 110 116 101 114 58 32 51 48 50 53 10]
received:  636f756e7465723a20333032350a
received:  [99 111 117 110 116 101 114 58 32 51 48 50 54 10]
received:  636f756e7465723a20333032360a

Полагаю, эти числа представляют counter: 2704, но, как вы видите, преобразование в строку не дает ожидаемого результата.

Кто-нибудьзнаете, что я здесь делаю не так? Как я могу преобразовать эти числа в строку? Все советы приветствуются!

Ответы [ 3 ]

2 голосов
/ 01 ноября 2019

Введенный текст уже является допустимой строкой. Просто у вас есть байты, хранящиеся в buf, что []byte. Чтобы преобразовать существующий []byte в значение типа string:

asString := string(buf)

Хотя hex.EncodeToString возвращает строку, он возвращает шестнадцатеричное представление каждого байта. Например, UTF-8 / ASCII для строчных букв c, десятичный код 99 - 0x63, поэтому первые два символа hex.EncodeToString - 6 и 3.

(Между тем, вы должны выяснить, что делать с реальными ошибками. Ваш код в настоящее время игнорирует их, после объявления о тех, которые не io.EOF. Если ваше устройство переходит в состояние ошибки, вы будете повторять цикл снова и снова, получая одну и ту же ошибку.)

1 голос
/ 01 ноября 2019

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

fmt.Println("received: ", buf)
fmt.Println("received: ", hex.EncodeToString(buf))

Я просто должен был сделать это:

fmt.Println("received: ", string(buf))

Я надеюсь, что это может помочь кому-то еще с той же проблемой. Желаю всем прекрасного дня.

0 голосов
/ 01 ноября 2019

использование

txt = "".join(chr(val) for val in buffer)
print(txt)
...