如何连接任意数量的QThread端口?

问题描述 投票:0回答:0
from PySide6.QtWidgets import QWidget,QApplication,QPushButton
from PySide6.QtCore import QThread
import sys
import serial.tools.list_ports as sp
import serial


class Worker(QThread):
    def __init__(self,get_port,parent=None):
        super().__init__()
        
        print(get_port)
        
        self.serial_read(get_port)
        
        self.working = False

    def serial_read(self,get_port):
        for i in range(len(get_port)):
            self.ser = serial.Serial()
            self.ser.port = get_port[i]
            self.ser.baudrate = 115200
            self.ser.timeout = 0.5
            self.ser.open()
        
    def run(self):
        while self.working:
            self.ser.write('2101\r\n'.encode())
            self.ser.write('2201\r\n'.encode())
            data = self.ser.readline()
            print(data)
            
    def stop(self):
        self.self.worker = False
        self.quit()
        self.wait(3000)
        

class MainDisplay(QWidget):
    def __init__(self):
        super().__init__()
        

        self.port_list = []

        for i in range(len(sp.comports())):
            self.port_list.append(sp.comports()[i].device)
        
        self.btn = QPushButton('connect',self)
        self.btn.clicked.connect(self.btn_clicked)
        
        self.show()
        
    def btn_clicked(self):
        self.worker = Worker(self.port_list,self)
        self.worker.working = True
        self.worker.start()
        
        
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    execute = MainDisplay()
    sys.exit(app.exec_())                

现在的代码是将list_ports中的端口连接到serial并写入,用read从list_ports中读取值的代码

但是def run()中并没有读取到2101,只读取了2201

我认为问题是在复制上面的 ser = serial.Serial() 部分的过程中,前一个端口的 ser 变量本身被覆盖了。

如何为每个端口连接和接收串口值,使得serial.Serial()变量在接收任意数量端口的过程中在QThread中不重复?

    def run(self):
        while self.working:
            self.ser.write('2101\r\n'.encode())
            self.ser.write('2201\r\n'.encode())
            data = self.ser.readline()
            print(data)

忽略2101的值 检查2201

的值输出

ser 变量被覆盖

由于端口数量是任意的,所以不可能预先指定变量。

python-3.x pyqt5 serial-port qthread pyside6
© www.soinside.com 2019 - 2024. All rights reserved.