鱼C论坛

 找回密码
 立即注册
查看: 1991|回复: 2

[已解决]pyserial串口通讯检测不到虚拟串口,怎么能检测到虚拟串口

[复制链接]
发表于 2023-7-29 17:34:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
        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][0])
            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[i], qc.Qt.MatchFixedString)
                    if (index < 0):
                        self.comboBox_uart.addItem(ports_value[i])
                    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)
最佳答案
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][0])
    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,并在下拉框中添加新的串口选项。请确保你的代码中有相关的导入语句和适当的上下文环境。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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  下拉框中供用户选择。

这样,你的代码就应该能够检测到虚拟串口并正确显示可用串口列表了。记得在使用前,导入所需的库并确保相关的线程正常启动。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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][0])
    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,并在下拉框中添加新的串口选项。请确保你的代码中有相关的导入语句和适当的上下文环境。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 07:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表