From ead4cfcc9504321ef3fb0d772ae54eec969ca68e Mon Sep 17 00:00:00 2001 From: zhu-mengmeng <15588200382@163.com> Date: Mon, 30 Jun 2025 20:43:52 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=AD=A3=E5=B8=B8=E6=89=93=E5=BC=80?= =?UTF-8?q?=E7=9B=B8=E6=9C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ui/main_window_ui.py | 7 ++-- utils/serial_manager.py | 3 ++ widgets/serial_settings_widget.py | 53 ++++++++++++++++++++++--------- 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/ui/main_window_ui.py b/ui/main_window_ui.py index f056de2..9a24254 100644 --- a/ui/main_window_ui.py +++ b/ui/main_window_ui.py @@ -210,7 +210,7 @@ class MainWindowUI(QMainWindow): self.material_frame = QFrame() self.material_frame.setFrameShape(QFrame.StyledPanel) self.material_frame.setLineWidth(1) - self.material_frame.setFixedHeight(380) # 恢复原始高度 + self.material_frame.setFixedHeight(380) # 保持上料区高度不变 self.material_frame.setStyleSheet("QFrame { background-color: #f8f8f8; }") self.material_layout = QHBoxLayout(self.material_frame) self.material_layout.setContentsMargins(0, 0, 0, 0) @@ -238,10 +238,11 @@ class MainWindowUI(QMainWindow): self.tray_frame = QFrame() self.tray_frame.setFrameShape(QFrame.StyledPanel) self.tray_frame.setLineWidth(1) + # 移除固定高度,让托盘号的高度自适应其内容 self.tray_frame.setFixedHeight(40) # 进一步减小高度,刚好容纳控件 self.tray_frame.setStyleSheet("QFrame { background-color: #f8f8f8; }") self.tray_layout = QHBoxLayout(self.tray_frame) - self.tray_layout.setContentsMargins(0, 0, 0, 0) # 移除所有边距 + self.tray_layout.setContentsMargins(0, 0, 0, 0) # 移除内边距,确保没有上下边界 # 移除所有边距 self.tray_layout.setSpacing(0) # 移除所有间距 self.tray_label = QLabel("托盘号") @@ -271,7 +272,7 @@ class MainWindowUI(QMainWindow): self.output_frame = QFrame() self.output_frame.setFrameShape(QFrame.StyledPanel) self.output_frame.setLineWidth(1) - self.output_frame.setFixedHeight(100) # 缩小下料区高度 + self.output_frame.setFixedHeight(100) # 压缩下料区域的高度,从原来的150减少到100 self.output_frame.setStyleSheet("QFrame { background-color: #f8f8f8; }") self.output_layout = QHBoxLayout(self.output_frame) self.output_layout.setContentsMargins(0, 0, 0, 0) diff --git a/utils/serial_manager.py b/utils/serial_manager.py index 151431a..0dccc6f 100644 --- a/utils/serial_manager.py +++ b/utils/serial_manager.py @@ -269,6 +269,9 @@ class SerialManager: elif port_type == 'xj': # 线径数据需要特殊处理 thread = threading.Thread(target=self._read_diameter_thread, args=(port_name,)) + thread.daemon = True + thread.start() + self.read_threads[port_name] = thread elif port_type == 'scanner': # 扫码器数据需要特殊处理 thread = threading.Thread(target=self._read_scanner_thread, args=(port_name,)) diff --git a/widgets/serial_settings_widget.py b/widgets/serial_settings_widget.py index b4ee05d..0ba1fd5 100644 --- a/widgets/serial_settings_widget.py +++ b/widgets/serial_settings_widget.py @@ -7,6 +7,7 @@ from PySide6.QtWidgets import QMessageBox from ui.serial_settings_ui import SerialSettingsUI from utils.config_loader import ConfigLoader from utils.serial_manager import SerialManager +from PySide6.QtWidgets import QApplication class SerialSettingsWidget(SerialSettingsUI): """串口设置组件""" @@ -422,6 +423,29 @@ class SerialSettingsWidget(SerialSettingsUI): if self.serial_manager.is_port_open(port): self.serial_manager.close_port(port) + # 创建临时回调函数,用于测试期间接收扫码器数据 + def scanner_callback(port_name, data): + try: + # 尝试将字节解码为字符串 + try: + text = data.decode('utf-8').strip() + # 如果数据以"扫码数据: "开头,提取实际数据部分 + if text.startswith("扫码数据: "): + text = text[6:].strip() + QMessageBox.information(self, "测试成功", f"收到扫码数据:\n{text}") + except: + # 如果解码失败,显示十六进制 + hex_str = ' '.join(f'{b:02X}' for b in data) + QMessageBox.information(self, "测试成功", f"收到扫码数据 (十六进制):\n{hex_str}") + except Exception as e: + logging.error(f"处理扫码回调数据失败: {e}") + + # 保存原始回调 + original_callback = self.serial_manager.callbacks.get('scanner_data', None) + + # 设置临时回调 + self.serial_manager.callbacks['scanner_data'] = scanner_callback + # 尝试打开串口 success = self.serial_manager.open_port( port, 'scanner', baud, data_bits, stop_bits, parity, 1.0 @@ -430,28 +454,27 @@ class SerialSettingsWidget(SerialSettingsUI): if success: QMessageBox.information(self, "测试成功", f"串口 {port} 打开成功\n请触发扫码器进行扫描测试") - # 尝试读取数据(短暂等待扫码器输入) + # 等待用户操作扫码器(最多等待10秒) start_time = time.time() - timeout = 5.0 # 5秒超时 + timeout = 10.0 # 10秒超时 while time.time() - start_time < timeout: - response = self.serial_manager.read_data(port) - if response: - # 尝试将字节解码为字符串 - try: - text = response.decode('utf-8').strip() - QMessageBox.information(self, "测试成功", f"收到扫码数据:\n{text}") - break - except: - # 如果解码失败,显示十六进制 - hex_str = ' '.join(f'{b:02X}' for b in response) - QMessageBox.information(self, "测试成功", f"收到扫码数据 (十六进制):\n{hex_str}") - break - + # 使用QApplication处理事件,保持UI响应 + QApplication.processEvents() time.sleep(0.1) # 短暂休眠,减少CPU占用 # 关闭串口 self.serial_manager.close_port(port) + + # 恢复原始回调 + if original_callback: + self.serial_manager.callbacks['scanner_data'] = original_callback + else: + # 如果之前没有回调,则删除临时回调 + if 'scanner_data' in self.serial_manager.callbacks: + del self.serial_manager.callbacks['scanner_data'] + + QMessageBox.information(self, "测试完成", f"串口 {port} 已关闭") else: QMessageBox.critical(self, "测试失败", f"无法打开串口 {port}")