Получение ошибок b '\ x08'b' \ x9e'b '\ x1d' или b '\ xe0'b' \ xe0'b 'из последовательного соединения - PullRequest
1 голос
/ 25 июня 2019

У меня есть USB-соединение с устройством , которое выдает последовательную информацию. Когда я запускаю свой скрипт на Python ниже (в блокноте Jupyter), я получаю из него странную информацию.

import serial

ser = serial.Serial(port='COM3', baudrate=115200, bytesize=serial.EIGHTBITS, 
    parity=serial.PARITY_NONE, timeout=1)
ser.flushInput()

while True:
    print(ser.read())

Когда я устанавливаю скорость 115200, я получаю следующую информацию: b '\ xe0'b' \ xe0'b '\ x00'b' \ x00'b '\ xe0'b' \ x00'b '\ x00'b' \ xe0 '...

В 9200 я получаю это: Ь '\ x08'b' \ x9e'b '\ x1d'b' \ xca'b'L'b'k'b '\ x84'b' \ xff'b '\ x90'b' \ x8c'b» G'b '\ X9b'

Кто-нибудь знает, как получить реальные данные? Я должен получать информацию о солнечном контроллере заряда, как

V: 12

A: 1

и т.д.

Edit: У меня есть следующее прямо сейчас, которое не дает никаких отпечатков: 1-я ячейка:

import os, serial, argparse

class vedirect:

    def __init__(self, serialport, timeout):
        self.serialport = serialport
        self.ser = serial.Serial(serialport, 19200, timeout=timeout)
        self.header1 = '\r'
        self.header2 = '\n'
        self.hexmarker = ':'
        self.delimiter = '\t'
        self.key = ''
        self.value = ''
        self.bytes_sum = 0;
        self.state = self.WAIT_HEADER
        self.dict = {}


    (HEX, WAIT_HEADER, IN_KEY, IN_VALUE, IN_CHECKSUM) = range(5)

    def input(self, byte):
        if byte == self.hexmarker and self.state != self.IN_CHECKSUM:
            self.state = self.HEX


        if self.state == self.WAIT_HEADER:
            self.bytes_sum += ord(byte)
            if byte == self.header1:
                self.state = self.WAIT_HEADER
            elif byte == self.header2:
                self.state = self.IN_KEY

            return None
        elif self.state == self.IN_KEY:
            self.bytes_sum += ord(byte)
            if byte == self.delimiter:
                if (self.key == 'Checksum'):
                    self.state = self.IN_CHECKSUM
                else:
                    self.state = self.IN_VALUE
            else:
                self.key += byte
            return None
        elif self.state == self.IN_VALUE:
            self.bytes_sum += ord(byte)
            if byte == self.header1:
                self.state = self.WAIT_HEADER
                self.dict[self.key] = self.value;
                self.key = '';
                self.value = '';
            else:
                self.value += byte
            return None
        elif self.state == self.IN_CHECKSUM:
            self.bytes_sum += ord(byte)
            self.key = ''
            self.value = ''
            self.state = self.WAIT_HEADER
            if (self.bytes_sum % 256 == 0):
                self.bytes_sum = 0
                return self.dict
            else:
                print ('Malformed packet')
                self.bytes_sum = 0
        elif self.state == self.HEX:
            self.bytes_sum = 0
            if byte == self.header2:
                self.state = self.WAIT_HEADER
        else:
            raise AssertionError()

    def read_data(self):
        while True:
            byte = self.ser.read(1)
            packet = self.input(byte)

    def read_data_single(self):
        while True:
            byte = self.ser.read(1)
            packet = self.input(byte)
            if (packet != None):
                return packet


    def read_data_callback(self, callbackFunction):
        while True:
            byte = self.ser.read(1)
            if byte:
                packet = self.input(byte)
                if (packet != None):
                    callbackFunction(packet)
            else:
                break


def print_data_callback(data):
    print (data)


#print(ve.read_data_single())

второй:

ve = vedirect("COM3", 1)

Три раза подряд [*]:

print(ve.read_data_single())

Тем временем я получил это

Когда я получаю сообщение [0], я получаю \ t, но в нем больше нет значений

1 Ответ

0 голосов
/ 25 июня 2019

Если вы пытаетесь использовать протокол VE-Direct , в соответствии с руководством :

При включении питания интерфейс VE.Direct всегда будет находиться в текстовом режиме и непрерывно передает все поля времени выполнения. Как только он получает действительное HEX-сообщение, он переключается в HEX-режим. Он будет оставаться в режиме HEX до тех пор, пока HEX-сообщения часто принимаются. После того, как продукт не получил действительный HEX-сообщения на несколько секунд переключатся обратно в текстовый режим и начнут автоматическую передачу Поля времени выполнения периодически снова. Некоторые продукты будут отправлять асинхронные HEX-сообщения, начиная с «: A» и заканчивая новой строкой «\ n», самостоятельно. Эти сообщения могут прерывать обычную Рамка в текстовом режиме.

Похоже, ваша проблема в том, что вы неправильно устанавливаете скорость передачи данных, которая по умолчанию равна 19200.

Если вы хотите работать в режиме HEX, вы можете сделать это с помощью Python 3.x, просто декодируйте сообщение HEX:

received_hex=ser.read()
received_utf=received_hex.decode()
print(received_utf)

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

Возможно, вам потребуется проверить страницу 4 руководства и версию прошивки вашего устройства, чтобы узнать, поддерживает ли вы протокол VE-Direct

Если вы не уверены в настройках (остановка битов и т. Д.), Возможно, имеет смысл начать подключать ваше устройство с помощью терминальной программы, такой как putty (которую вы, похоже, уже используете). Если вы работаете в Windows, я думаю, RealTerm проще в использовании, и вы можете легко переключаться с HEX на ASCII.

РЕДАКТИРОВАТЬ: Как оказалось, для этого конкретного протокола сделано довольно много полезных вещей. Этот скрипт выглядит очень многообещающе.

Если вы хотите запустить этот скрипт, откройте терминал DOS (убедитесь, что папка Python C:\Python3.x\bin находится в вашем пути, перейдите в папку, где вы сохранили скрипт (C:\Example) и введите:

C:\Example\python vedirect.py --port COM3

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

message=""
while True:
    message += ser.read()
    print(message)

Вывод, очевидно, довольно уродливый, но немного поработав, вы можете сделать его похожим на скрипт выше. В руководстве также есть несколько хороших советов о том, как читать данные для этих устройств. Посмотрите и посмотрите, сможете ли вы собрать это вместе. Теперь, в зависимости от ваших потребностей, вы можете предпочесть работать над своим собственным сценарием или начать с другого. Если вы учитесь, попробуйте сделать это самостоятельно, прежде чем смотреть на решение, если вам нужно иметь решение как можно скорее, тогда я думаю, что скрипт github - это то, что вам нужно.

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