import serial.tools.list_ports import time # mcu命令 class DeviceControl: def scan_serial_port(self) -> dict: # 获取所有可用串口列表 ports_dict = {} ports = serial.tools.list_ports.comports() # 遍历所有端口并打印信息 for port in ports: if "CH340" in port.description: ports_dict[port.name] = { "name": port.name, "device": port.device, "description": port.description, "hwid": port.hwid, "manufacturer": port.manufacturer, "product": port.product, "serial_number": port.serial_number, } if len(ports_dict) <= 0: return {} return ports_dict def add_port(self, port_name, port_value=None): # port_value :串口基础信息 # todo 根据prot_value 信息自动进行连接 print("add", port_name) # 对没有连接的设备进行尝试连接 self.sign_data.emit( { "_type": "show_info", "plugins_mode": "auto_select_com", "data": {"text": "开始识别接口:{}".format(port_name)}, } ) time.sleep(1) """ 步骤: 1、进行临时连接,并发送命令,成功后,自动连接对应设备 """ try: # 尝试使用115200波特率链接 serial_handle = serial.Serial(port=port_name, baudrate=115200, timeout=0.5) except: self.sign_data.emit( { "_type": "show_info", "plugins_mode": "auto_select_com", "data": {"text": "串口:{} 被占用,或无法识别".format(port_name)}, } ) print("串口:{} 被占用".format(port_name)) return time.sleep(2) print("开始发送命令") data = [90, 1] try: serial_handle.flushInput() # 尝试重置输入缓冲区 except serial.SerialTimeoutException: print("超时错误:无法在规定时间内重置输入缓冲区。") serial_handle.close() return print("尝试写入数据") buf = bytearray(b"") buf.extend([0x55, 0x55, (0xFF & len(data))]) buf.extend(data) buf.extend([0xFF & ~sum(data)]) try: self.receive_data = b"" serial_handle.write(buf) except serial.SerialTimeoutException: print("写入数据错误") serial_handle.close() return time.sleep(0.3) print("尝试接收命令") receive_data = self.read_cmd(serial_handle) device_id = 0 if receive_data: print("receive_data", receive_data) if receive_data[0] == 90: connect_flag = receive_data[1] device_id = receive_data[2] print("关闭串口:{}".format(port_name)) serial_handle.close() if device_id > 0: if device_id == 1: self.windows.mcu.to_connect_com(port_name, is_test=False) self.sign_data.emit( { "_type": "show_info", "plugins_mode": "auto_select_com", "data": {"text": "MCU开始连接"}, } ) self.connected_ports_dict[port_name] = "MCU" if device_id == 2: self.windows.remote_control.to_connect_com(port_name, is_test=False) self.sign_data.emit( { "_type": "show_info", "plugins_mode": "auto_select_com", "data": {"text": "开始连接遥控器"}, } ) self.connected_ports_dict[port_name] = "有线遥控器" # RemoteControlV2 新版遥控器 2024-12-02 if device_id == 4: self.windows.remote_control_v2.to_connect_com(port_name, is_test=False) self.sign_data.emit( { "_type": "show_info", "plugins_mode": "auto_select_com", "data": {"text": "开始连接遥控器V2"}, } ) self.connected_ports_dict[port_name] = "无线遥控器V2" self.sign_data.emit( { "_type": "select_port_name", "plugins_mode": "auto_select_com", "data": { "device_name": "mcu" if device_id == 1 else "remote_control", "port_name": port_name, }, } ) else: print("串口无法识别") # 走其他途径处理 # 检查当前MCU链接是否正常 # 正常跳过;记录为其他列表 # 不正常进行尝试连接 # 连接不上,记录为其他列表