Python3.x+PyQt5+PySerial串口读写的流程

Version

Python3.7
PySerial3.4
PyQt5.8+

在一个实例类中

1.先导入串口依赖包
2.串口实例化(初始化)
3.串口发送数据(上位机请求指令)
4.串口开启线程接收数据(上位机得到响应指令)
5.上位机把得到的响应指令解析出来,并返回用户界面

具体示例

1.先导入串口PySerial依赖包

pip安装依赖包:
pip install pyserial >= 3.4
在模块头文件导入:
import serial.tools.list_ports

2.串口实例化(初始化),在类中示例

self.port = serial.Serial()         # 实例化串口

# 打开串口:
def port_open(self):
    """
    打开串口
    """
    if not self.port.isOpen():
        self.port.port = self.com_list[-1]  # 这里获取最后(最新)一个串口
        self.port.baudrate = 9600    # 波特率
        self.port.bytesize = 8       # 数据位
        self.port.stopbits = 1	# 停止位

        try:
            self.port.open()
        except Exception as e:
            # noinspection PyCallByClass
            QMessageBox.critical(self, "Port Error", "串口打开失败!\n{0}".format(e))


3.串口发送数据(上位机请求指令)

def read_module_all(self):
    """
    PC上位机发送请求读取指令,
    PC上位机接收数据要开启线程
    :return:
    """
    if self.port.isOpen():
        try:
            self.port.write(MyMainSerial.fun_pc_read_cmd())  # 上位机先发送<请求读取>指令
            # 接收数据要开启线程
            self.serial_thread = threading.Thread(target=self.read_module_data)
            self.serial_thread.setDaemon(True)
            self.serial_thread.start()
        except Exception as e:
            print('PC接收数据(read_module_all)', e)
            

4.串口开启线程接收数据(上位机得到响应指令)

# 接收数据要开启线程
self.serial_thread = threading.Thread(target=self.read_module_data)
self.serial_thread.setDaemon(True)
self.serial_thread.start()

def read_module_data(self):
    """
    接收信息的具体流程
    :return:
    """
    read_times = 0
    while True:
        if read_times < 86400
            try:
                time.sleep(0.5)
                num = self.port.inWaiting()
            except Exception as e:
                print('>>error PC接收数据(read_module_data),已关闭串口', e)
                num = 0
            if num > 0:
                try:
		          	data_8 = bytearray()
                 	data_8 = self.port.read(48)  
                    crc_three, out_s = MyMainSerial.rec_module_cmd(data_8)
                    if crc_three == out_s.strip()[-9:]:
                        time.sleep(0.2)
                        # noinspection PyCallByClass
                        self.module_msg = MyMainSerial.text_main_table__message(self, out_s)  
                        self.signal_write_table.emit('update')
                except Exception as e:
                    print('>>error 接收数据异常<read_module_data>:', e)
                    self.port.write(MyMainSerial.fun_pc_read_cmd())
                    read_times += 1
                    time.sleep(0.2)
            else:
                if self.port.isOpen():
                    self.port.write(MyMainSerial.fun_pc_read_cmd())
                read_times += 1
                time.sleep(0.2)
            

5.上位机把得到的响应指令解析出来,并返回用户界面

def text_main_table__message(self, out_s):
    """
    响应<上位机读取指令>的数据解析 - 信息获取
    :param out_s:  响应指令<str>
    :return: array_two[截取0x前缀的数据]<list[str16]>
    """
    array_list = list()
    array_list.append(out_s.split())    # 按空格截取追加到array_list列表里面

    # 截取0x前缀
    array_two = list()
    for i in range(len(array_list[0])):
        array_two.append(array_list[0][i][2:])
    print('截取0x前缀后的列表:', array_two)

    return array_two


猜你喜欢

转载自blog.csdn.net/Yuyh131/article/details/88815798