【问题标题】:Pyserial read bytes return garbage values from serial portPyserial 读取字节从串口返回垃圾值
【发布时间】:2019-09-25 09:52:16
【问题描述】:

在我的 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\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\ X ff\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

预期值/实际值:(我在运行 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 78 95 99B 1 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 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 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 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 FF FF FF FF FF FF FF FF FF FF FF 00 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 00 01 00 09 25 11 02 10 3C 00 6A 2 150 9 02 7 20 1 0 3 150 9 02 7 20 1 0 30 39 32 31 31 31 30 32 31 30 34 56 78 90 20 20 20 20 20 20 20 20 20 20 20 09 78 52 22 01 53 00 00 00 000202020 2020 20 20 09 78 5222 01 53 00 00 00 0002202020202020202020202020202020202020202020202020201010101 41 82 02 20 00 95 05 00 00 00 00 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 08 EB 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 01 34 CF 019 29 04 4 77 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 0 0 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 35 03

【问题讨论】:

  • 我是否错过了关于从 python 接收到的字节的任何对话?

标签: byte pyserial garbage


【解决方案1】:

在 HEX 中对转义的字节字符串进行编码时基本相同

02020e010b01300241011720190925110011e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b8550100ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0003ffffff0100b238048008c08a02000000000000000330000000000000010009251100113c00691100110925057251313930393235313130303131345678902009785222015300000001014182022000950500000000009c01005f2a0209785f3401009f02060000000001009f03060000000000009f1007060d0a03a020009f1a0208409f2608933f5d8c4cb11bd49f2701809f360200c29f3704c3e8eef99f3901079f6604a000c0009f6e0420700000cf01045713492945778917200 6d21032010013100000001f9a03190925dfdf23020840dfdf270100001092cfeb93b2e0fe00002c00243ad5341489968b09dbb9d4c9db367d8e9e50c13f9161dd067ec8caa5a

你可以通过调用其hex方法将字节转换为十六进制

hex_string=bytes.hex()

【讨论】:

  • 如何在 python 中与 Hex 进行对话?
  • 基本上我想将每个字节转换为十六进制字符串,所以请让我知道 Pyhton 中的对话?
  • 好的,我添加了python3的代码,但最好直接使用字节,例如根据流格式使用struct modul
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2013-02-07
  • 1970-01-01
  • 2016-11-09
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多