吴永铎 发表于 2023-7-29 17:34:38

pyserial串口通讯检测不到虚拟串口,怎么能检测到虚拟串口

      def check_valid_uart():
            ports_value = []
            ports_list = serial.tools.list_ports.comports()
            for i in range(len(ports_list)):
                ports_value.append(ports_list)
            print("ports_value is ", ports_value)

            if (0 == len(ports_value)):
                print("can't find uart port.")
                self.comboBox_uart.clear()
                self.comboBox_uart.setCurrentIndex(-1)
            else:
                for i in range(len(ports_value)):
                  index = self.comboBox_uart.findText(ports_value, qc.Qt.MatchFixedString)
                  if (index < 0):
                        self.comboBox_uart.addItem(ports_value)
                  else:
                        print("curent port is ", self.comboBox_uart.currentText())
      #开启监听线程
      def gui_status_thread():
            print("start gui_status_thread.")
            while(True):
                check_valid_uart()
                sleep(3)

isdkz 发表于 2023-7-29 17:34:52

在代码中, check_valid_uart()函数用于检测可用的串口,并将它们添加到一个下拉框( comboBox_uart )中供用户选择。但是,该函数似乎无法检测到虚拟串口,导致无法正确显示可用串口列表。

要解决无法检测虚拟串口的问题,我们可以尝试使用 pyserial 库的list_ports.comports()方法之前,先调用list_ports.grep()方法来过滤掉虚拟串口。虚拟串口通常在 Windows 系统上使用“COMx”或类似的名称表示,而在类 Unix 系统上使用 "/dev/tty*" 表示。

下面是改进后的代码:

import serial.tools.list_ports
import re

def check_valid_uart():
    ports_value = []
    # 正则表达式匹配虚拟串口名称
    virtual_ports_pattern = re.compile(r"(COM\d+|/dev/tty\w+)")
   
    ports_list = serial.tools.list_ports.comports()
    for port in ports_list:
      port_name = port.device
      # 如果串口名称不是虚拟串口,则将其添加到列表中
      if not virtual_ports_pattern.match(port_name):
            ports_value.append(port_name)
   
    print("ports_value is", ports_value)

    if len(ports_value) == 0:
      print("can't find uart port.")
      self.comboBox_uart.clear()
      self.comboBox_uart.setCurrentIndex(-1)
    else:
      self.comboBox_uart.clear()
      for port_name in ports_value:
            self.comboBox_uart.addItem(port_name)

# 开启监听线程
def gui_status_thread():
    print("start gui_status_thread.")
    while True:
      check_valid_uart()
      sleep(3)


在这个改进后的代码中,使用了正则表达式virtual_ports_pattern匹配虚拟串口的名称。然后,我们遍历串口列表,并将不是虚拟串口的名称添加到ports_value列表中。最后,将ports_value中的串口名称添加到comboBox_uart下拉框中供用户选择。

这样,你的代码就应该能够检测到虚拟串口并正确显示可用串口列表了。记得在使用前,导入所需的库并确保相关的线程正常启动。

陶远航 发表于 2023-7-29 17:34:53

要检测虚拟串口,你可以使用pyserial库的list_ports.comports()方法。以下是给定代码的修改版本,以便检测虚拟串口:

import serial.tools.list_ports
from time import sleep

def check_valid_uart():
    ports_value = []
    ports_list = serial.tools.list_ports.comports()
    for i in range(len(ports_list)):
      ports_value.append(ports_list[ i])
    print("ports_value is ", ports_value)
   
    if len(ports_value) == 0:
      print("无法找到串口.")
      self.comboBox_uart.clear()
      self.comboBox_uart.setCurrentIndex(-1)
    else:
      for i in range(len(ports_value)):
            index = self.comboBox_uart.findText(ports_value[ i], qc.Qt.MatchFixedString)
            if index < 0:
                self.comboBox_uart.addItem(ports_value[ i])
            else:
                print("当前串口为 ", self.comboBox_uart.currentText())

# 开启监听线程
def gui_status_thread():
    print("开始 gui_status_thread 线程.")
    while True:
      check_valid_uart()
      sleep(3)


这段代码将使用list_ports.comports()函数获取所有可用串口列表,并将其添加到ports_value中。如果没有找到任何串口,它将清除下拉框(comboBox_uart)并将其索引设置为-1。否则,它会遍历ports_value,并在下拉框中添加新的串口选项。请确保你的代码中有相关的导入语句和适当的上下文环境。
如果问题已经解决,请设置最佳答案
页: [1]
查看完整版本: pyserial串口通讯检测不到虚拟串口,怎么能检测到虚拟串口