Pyterial прочитанные байты возвращают значения мусора из последовательного порта - PullRequest
0 голосов
/ 25 сентября 2019

в моей программе на Python я использую библиотеку PySerial для считывания данных в виде байтов из последовательного порта.Но большинство байтов являются значениями мусора.Я даю исходные и выходные данные для чтения байтов с помощью этого модуля python.

Так что, может, некоторые, пожалуйста, дайте мне знать (правильные настройки конфигурации), чтобы прочитать правильные значения из последовательного порта, используя библиотеку PySerial?Если нет, у нас есть любая другая последовательная библиотека в Python, где я могу читать байты без вышеуказанной проблемы.

import serial
import sys
import _thread
import serial.tools.list_ports
import threading


class SerialPort:
    ReceiveCallback: None

    def __init__(self):
        self.comportName = ""
        self.baud = 0
        self.timeout = None
        self.ReceiveCallback = None
        self.isopen = False
        self.receivedMessage = None
        self.serialport = serial.Serial()

    def __del__(self):
        try:
            if self.serialport.is_open():
                self.serialport.close()
        except:
            print("Destructor error closing COM port: ", sys.exc_info()[0])

    def RegisterReceiveCallback(self, aReceiveCallback):
        self.ReceiveCallback = aReceiveCallback
        try:
            ListnerThread = threading.Thread(target=self.SerialReadBytesThread)
            ListnerThread.start()
        except:
            print("Error starting Read thread: ", sys.exc_info()[0])

    def SerialReadlineThread(self):
        while True:
            try:
                if self.isopen:
                    self.receivedMessage = self.serialport.readline()
                    if self.receivedMessage != "":
                        self.ReceiveCallback(self.receivedMessage)
            except:
                print("Error reading COM port: ", sys.exc_info()[0])

    def SerialReadBytesThread(self):
        while True:
            try:
                if self.isopen:
                    size = self.serialport.inWaiting()
                    if size > 0:
                        readBytes = self.serialport.read(size)
                        self.receivedMessage = bytearray(readBytes)
                        if self.receivedMessage != b'':
                            self.ReceiveCallback(self.receivedMessage)
            except serial.SerialException as e:
                print("Error reading com port:", e.strerror)

    def IsOpen(self):
        return self.isopen

    def Open(self, portname, baudrate, timeout=0):
        if not self.isopen:
            # serialPort = 'portname', baudrate, bytesize = 8, parity = 'N', stopbits = 1, timeout = None, xonxoff = 0, rtscts = 0)
            self.serialport.port = portname
            self.serialport.baudrate = baudrate
            self.serialport.timeout = timeout
            try:
                self.serialport.open()
                self.isopen = True
                self.serialport.flushInput()
            except:
                print("Error opening COM port: ", sys.exc_info()[0])

    def Close(self):
        if self.isopen:
            try:
                self.serialport.close()
                self.isopen = False
            except:
                print("Close error closing COM port: ", sys.exc_info()[0])

    def Send(self, message):
        if self.isopen:
            try:
                # Ensure that the end of the message has both \r and \n, not just one or the other
                newmessage = message.strip()
                newmessage += '\r\n'
                self.serialport.write(newmessage.encode('utf-8'))
            except:
                print("Error sending message: ", sys.exc_info()[0])
            else:
                return True
        else:
            return False

    def GetComPort(vendorProductID):
        portName = " "
        ports = serial.tools.list_ports.comports()
        for port, des, hwID in ports:
            if vendorProductID in hwID:
                portName = port
                return portName
        return portName


if __name__ == '__main__':
    portName = SerialPort.GetComPort("VID:PID=0DB5:0180")
    comport = SerialPort()
    comport.Open(portName, 115200)
    t=threading.Thread(target=comport.SerialReadBytesThread)
    t.start()
    t.join()

Результат чтения данных из модуля Python:

b '\ x02 \ x02 \ x0e \ x01 \ x0b \ x010 \ x02A \ x01 \ x17 \ x19 \ t% \ x11 \ x00 \ x11 \ xe3 \ xb0 \ xc4B \ x98 \ xfc \ x1c \ x14 \ x9a \ xfb \XF4 \ xc8 \ x99o \ xb9 $ \ '\ xaeA \ xe4d \ X9b \ x93L \ xa4 \ x95 \ x99 \ x1bxR \ xb8U \ x01 \ x00 \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF\ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF\ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF\ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF\ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF\ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF\ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF\ XFF \ XFF \ XFе \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ XFF \ x00 \ x03 \ XFF \ XFF \ XFF \x01 \ x00 \ xb28 \ x04 \ x80 \ x08 \ xc0 \ X8A \ x02 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x030 \ x00 \ x00 \ x00 \ x00 \ x00 \ x00 \ x01 \ x00 \t% \ x11 \ x00 \ x11 <\ x00i \ x11 \ x00 \ x11 \ t% \ x05rQ1909251100114Vx \ x90 \ txR "\ x01S \ x00 \ x00 \ x00 \ x01 \ x01A \ x82 \ x02 \ x00 \ x95 \ x05 \x00 \ x00 \ x00 \ x00 \ x00 \ x9c \ x01 \ x00 _ * \ x02 \ tx_4 \ x01 \ x00 \ x9f \ x02 \ x06 \ x00 \ x00 \ x00 \ x00 \ x01 \ x00 \ x9f \ x03 \ x06 \ x00\ x00 \ x00 \ x00 \ x00 \ x00 \ x9f \ x10 \ x07 \ x06 \ r \ n \ x03 \ xa0 \ x00 \ x9f \ x1a \ x02 \ x08 @ \ x9f & \ x08 \ x93?] \ x8cL \ xb1 \X1B \ xd4 \ x9f \ '\ x01 \ x80 \ x9f6 \ x02 \ x00 \ xc2 \ x9f7 \ x04 \ xc3 \ X Е8 \ Xee \ xf9 \ x9f9 \ x01 \ X07 \ x9ff \ x04 \ xa0 \ x00 \ xc0 \ x00 \x9fn \ x04 p \ x00 \ x00 \ xcf \ x01 \ x04W \ x13I) Ew \ x89 \ x17 \ x06 \ xd2 \ x102 \ x01 \ x00 \ x13 \ x10 \ x00 \ x00 \ x00 \ x1f \ X9a \ x03 \ x19 \ т% \ XDF \ XDF # \ x02 \ x08 @ \ XDF \ XDF \ '\ x01 \ x00 \ x00 \ x10 \ x92 \ XCF \ xeb \ x93 \ XB2 \ xe0 \ XFE\ x00 \ x00 \ x00 $: \ xd54 \ x14 \ x89 \ x96 \ x8b \ т \ XDB \ xb9 \ xd4 \ xc9 \ xdb6} \ x8e \ x9eP \ xc1 \ x91a \ XDD \ x06 ~ \ xc8 \ XCA?\ x85 \ xd8 ^ \ xa7 \ xda \ xa9 \ x03 \ x03 '</p>

Ожидаемое значение / фактическое значение: (я получил это значение из инструмента для снятия последовательного порта во время работы моего модуля python)

02 02 0E 01 0B 01 30 02 41 01 17 20 19 09 25 11 02 10 E3 B0 C4 42 98 FC 1C 14 9A FB F4 C8 99 6F B9 24 27 AE 41 E4 64 9B 93 4C A495 99 1B 78 52 B8 55 01 00 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFFFF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FFFF00 03 FF FF FF 01 00 B2 38 04 80 08 C0 8A 02 00 00 00 00 00 00 00 03 30 00 00 00 00 00 01 00 09 25 11 02 10 3C 00 6A 11 02 10 09 25 05 72 51 31 3930 39 32 35 31 31 30 32 31 30 34 56 78 90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 09 78 52 22 01 53 00 00 00 01 01 41 82 02 20 00 95 05 00 00 0000 00 9C 01 00 5F 2A 02 09 78 5F 34 01 00 9F 02 06 00 00 00 00 01 00 9F 03 06 00 00 00 00 00 00 9F 10 07 06 0D 0A 03 A0 20 00 9F 1A 02 08 40 9F 26 08EB 12 3F BB 4A 81 AB 37 9F 27 01 80 9F 36 02 00 C3 9F 37 04 0E D2 3B E0 9F 39 01 07 9F 66 04 A0 00 C0 00 9F 6E 04 20 70 00 00 CF 01 04 57 13 49 29 4577 89 17 20 06 D2 10 32 01 00 13 10 00 00 00 1F 9A 03 19 09 25 DF DF 23 02 08 40 DF DF 27 01 00 00 10 92 CF
EB 93 B2 E0 FE 00 00 2D 00 24 B8 CD E0 22 A4 03 6E 2D D3 96 9E 0C 39 3A 6F 9C 01 45 88 F2 AC AF F2 C1 07 67 3F 07 52 16 FF 3D 26 3503

1 Ответ

0 голосов
/ 25 сентября 2019

Это в основном то же самое, когда вы кодируете свою экранированную строку байтов в HEX

Вы можете конвертировать байты в шестнадцатеричный код, вызвав его шестнадцатеричный метод

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