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 变量被覆盖
由于端口数量是任意的,所以不可能预先指定变量。