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)
在代码中, 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下拉框中供用户选择。
这样,你的代码就应该能够检测到虚拟串口并正确显示可用串口列表了。记得在使用前,导入所需的库并确保相关的线程正常启动。 要检测虚拟串口,你可以使用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]