from serial.serialutil import SerialTimeoutException from all_ui.uart import Ui_MainWindow as pyui import serial import serial.tools.list_ports import time from PySide6.QtCore import QTimer A=0 currentcom="" class UI(pyui): def __init__(self): global current_com # 从文件中加载UI定义 super().__init__() self.setupUi(self) self.__portlist=[] #表示每1ms做一次receivedata当然需要用启动按钮来启动接收 self.time=QTimer() self.time.setInterval(50) self.time.timeout.connect(self.receive_data) #每4s就读取一次端口号 self.time1 = QTimer() self.time1.setInterval(4000) self.time1.timeout.connect(self.read_com) self.time1.start() #初始化端口列表 self.comboBox_2.addItems(self.get_com_list()) self.ser=serial.Serial() #初始化端口 self.ser.port=self.comboBox_2.currentText() #初始化波特率 self.ser.baudrate=int(self.comboBox.currentText()) self.ser.bytesize=int(self.comboBox_6.currentText()) #每个数据包的字节数 self.ser.timeout = 1 # 设置超时时间为1秒 #四个按钮 self.Button1.clicked.connect(self.button1_clicked) self.Button2.clicked.connect(self.button2_clicked) self.Button3.clicked.connect(self.button3_clicked) self.Button4.clicked.connect(self.button4_clicked) self.comboBox.currentTextChanged.connect(self.comboBoxchange) self.comboBox_2.currentTextChanged.connect(self.comboBox_2change) self.comboBox_3.currentTextChanged.connect(self.comboBox_3change) self.comboBox_4.currentTextChanged.connect(self.comboBox_4change) self.comboBox_5.currentTextChanged.connect(self.comboBox_5change) self.comboBox_6.currentTextChanged.connect(self.comboBox_6change) #button1为开始接收 def button1_clicked(self): #接收区的文本框 global A if A==0: A=1 else: A=0 if A==1: try: if not self.ser.is_open: self.ser.open() self.ser.read(10) except SerialTimeoutException: # 处理串口通信超时异常 self.plainTextEdit.insertPlainText("未检测到此端口有任何设备") self.ser.close() else: self.ser.close() self.ser.open() self.time.start() else: self.ser.close() self.time.stop() #将发送区的东西发出去 def button2_clicked(self): # 打开串口 if not self.ser.is_open: self.ser.open() # 清空输入缓冲区和输出缓冲区 # self.ser.reset_input_buffer() # self.ser.reset_output_buffer() # 将文本通过串口发送 self.ser.write(self.plainTextEdit_2.toPlainText().encode('utf-8')) # 将字符串转换为字节流并发送 # 关闭串口 self.ser.close() pass #清空接收区succ def button3_clicked(self): self.plainTextEdit.clear() #清空发送区succ def button4_clicked(self): self.plainTextEdit_2.clear() def receive_data(self): # num = self.ser.in_waiting # if num > 0: time.sleep(0.1) num = self.ser.in_waiting # 延时,再读一次数据,确保数据完整性 data = self.ser.read(num) try: self.plainTextEdit.insertPlainText(str(self.ser.read(num),'utf-8')) except UnicodeDecodeError: self.plainTextEdit.insertPlainText("波特率不对") self.ser.flush() pass def get_com_list(self): com_dev_list = tuple(serial.tools.list_ports.comports()) if not com_dev_list: self.__portlist = [] else: self.__portlist = [i.name for i in com_dev_list] return self.__portlist #动态读取目前的端口号succ def read_com(self): global currentcom currentcom=self.comboBox_2.currentText() if A==1: self.time.stop() self.ser.close() self.comboBox_2.clear() self.comboBox_2.addItems(self.get_com_list()) self.comboBox_2.setCurrentText(currentcom) self.ser.port = self.comboBox_2.currentText() if A==1: self.ser.open() self.time.start() #波特率succ def comboBoxchange(self): self.ser.baudrate=int(self.comboBox.currentText()) #端口号succ def comboBox_2change(self): self.ser.port=self.comboBox_2.currentText() #是否启用数据流控succ def comboBox_3change(self): if self.comboBox_3.currentText() == 'None': self.ser.xonxoff=False self.ser.dsrdtr=False self.ser.rtscts=False elif self.comboBox_3.currentText() == 'soft': self.ser.xonxoff = True self.ser.dsrdtr = False self.ser.rtscts = False else: self.ser.xonxoff = False self.ser.dsrdtr = True self.ser.rtscts = True pass #设置校验位succ def comboBox_4change(self): self.ser.parity=self.comboBox_4.currentText() #设置停止位succ def comboBox_5change(self): self.ser.stopbits = int(self.comboBox_5.currentText()) #设置一帧数据的长度一般默认为8succ def comboBox_6change(self): self.ser.bytesize=int(self.comboBox_6.currentText())