DeviceControl.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import serial.tools.list_ports
  2. import time
  3. # mcu命令
  4. class DeviceControl:
  5. def scan_serial_port(self) -> dict:
  6. # 获取所有可用串口列表
  7. ports_dict = {}
  8. ports = serial.tools.list_ports.comports()
  9. # 遍历所有端口并打印信息
  10. for port in ports:
  11. if "CH340" in port.description:
  12. ports_dict[port.name] = {
  13. "name": port.name,
  14. "device": port.device,
  15. "description": port.description,
  16. "hwid": port.hwid,
  17. "manufacturer": port.manufacturer,
  18. "product": port.product,
  19. "serial_number": port.serial_number,
  20. }
  21. if len(ports_dict) <= 0:
  22. return {}
  23. return ports_dict
  24. def add_port(self, port_name, port_value=None):
  25. # port_value :串口基础信息
  26. # todo 根据prot_value 信息自动进行连接
  27. print("add", port_name)
  28. # 对没有连接的设备进行尝试连接
  29. self.sign_data.emit(
  30. {
  31. "_type": "show_info",
  32. "plugins_mode": "auto_select_com",
  33. "data": {"text": "开始识别接口:{}".format(port_name)},
  34. }
  35. )
  36. time.sleep(1)
  37. """
  38. 步骤:
  39. 1、进行临时连接,并发送命令,成功后,自动连接对应设备
  40. """
  41. try:
  42. # 尝试使用115200波特率链接
  43. serial_handle = serial.Serial(port=port_name, baudrate=115200, timeout=0.5)
  44. except:
  45. self.sign_data.emit(
  46. {
  47. "_type": "show_info",
  48. "plugins_mode": "auto_select_com",
  49. "data": {"text": "串口:{} 被占用,或无法识别".format(port_name)},
  50. }
  51. )
  52. print("串口:{} 被占用".format(port_name))
  53. return
  54. time.sleep(2)
  55. print("开始发送命令")
  56. data = [90, 1]
  57. try:
  58. serial_handle.flushInput() # 尝试重置输入缓冲区
  59. except serial.SerialTimeoutException:
  60. print("超时错误:无法在规定时间内重置输入缓冲区。")
  61. serial_handle.close()
  62. return
  63. print("尝试写入数据")
  64. buf = bytearray(b"")
  65. buf.extend([0x55, 0x55, (0xFF & len(data))])
  66. buf.extend(data)
  67. buf.extend([0xFF & ~sum(data)])
  68. try:
  69. self.receive_data = b""
  70. serial_handle.write(buf)
  71. except serial.SerialTimeoutException:
  72. print("写入数据错误")
  73. serial_handle.close()
  74. return
  75. time.sleep(0.3)
  76. print("尝试接收命令")
  77. receive_data = self.read_cmd(serial_handle)
  78. device_id = 0
  79. if receive_data:
  80. print("receive_data", receive_data)
  81. if receive_data[0] == 90:
  82. connect_flag = receive_data[1]
  83. device_id = receive_data[2]
  84. print("关闭串口:{}".format(port_name))
  85. serial_handle.close()
  86. if device_id > 0:
  87. if device_id == 1:
  88. self.windows.mcu.to_connect_com(port_name, is_test=False)
  89. self.sign_data.emit(
  90. {
  91. "_type": "show_info",
  92. "plugins_mode": "auto_select_com",
  93. "data": {"text": "MCU开始连接"},
  94. }
  95. )
  96. self.connected_ports_dict[port_name] = "MCU"
  97. if device_id == 2:
  98. self.windows.remote_control.to_connect_com(port_name, is_test=False)
  99. self.sign_data.emit(
  100. {
  101. "_type": "show_info",
  102. "plugins_mode": "auto_select_com",
  103. "data": {"text": "开始连接遥控器"},
  104. }
  105. )
  106. self.connected_ports_dict[port_name] = "有线遥控器"
  107. # RemoteControlV2 新版遥控器 2024-12-02
  108. if device_id == 4:
  109. self.windows.remote_control_v2.to_connect_com(port_name, is_test=False)
  110. self.sign_data.emit(
  111. {
  112. "_type": "show_info",
  113. "plugins_mode": "auto_select_com",
  114. "data": {"text": "开始连接遥控器V2"},
  115. }
  116. )
  117. self.connected_ports_dict[port_name] = "无线遥控器V2"
  118. self.sign_data.emit(
  119. {
  120. "_type": "select_port_name",
  121. "plugins_mode": "auto_select_com",
  122. "data": {
  123. "device_name": "mcu" if device_id == 1 else "remote_control",
  124. "port_name": port_name,
  125. },
  126. }
  127. )
  128. else:
  129. print("串口无法识别")
  130. # 走其他途径处理
  131. # 检查当前MCU链接是否正常
  132. # 正常跳过;记录为其他列表
  133. # 不正常进行尝试连接
  134. # 连接不上,记录为其他列表