我正在寻找一种简单的方法来列出PC上所有可用的com端口。
我已经找到了这个方法,但它是特定于Windows的:Listing serial (COM) ports on Windows?
我在Windows7 PC上使用Python3和pySerial。
我在pySerial应用程序接口(http://pyserial.sourceforge.net/pyserial_api.html)中发现了一个函数serial.tools.list_ports.comports()
,它列出了com端口(这正是我想要的)。
import serial.tools.list_ports
print(list(serial.tools.list_ports.comports()))
但它似乎不起作用。当我的USB网关连接到PC时(我在设备管理器中看到COM5 ),此COM端口不包括在list_ports.comports()
返回的列表中。相反,我只得到了COM4,它似乎连接到了调制解调器(我在设备管理器的COM&LPT部分没有看到它)!
你知道为什么它不工作吗?您是否有其他非系统特定的解决方案?
发布于 2013-01-09 05:38:10
这是我使用的代码。
在Windows8.1 x64,Windows10 x64,MacOSX10.9.x/ 10.10.x / 10.11.x和Ubuntu14.04/ 14.10 / 15.04 / 15.10上成功测试了Python2和Python3。
import sys
import glob
import serial
def serial_ports():
""" Lists serial port names
:raises EnvironmentError:
On unsupported or unknown platforms
:returns:
A list of the serial ports available on the system
"""
if sys.platform.startswith('win'):
ports = ['COM%s' % (i + 1) for i in range(256)]
elif sys.platform.startswith('linux') or sys.platform.startswith('cygwin'):
# this excludes your current terminal "/dev/tty"
ports = glob.glob('/dev/tty[A-Za-z]*')
elif sys.platform.startswith('darwin'):
ports = glob.glob('/dev/tty.*')
else:
raise EnvironmentError('Unsupported platform')
result = []
for port in ports:
try:
s = serial.Serial(port)
s.close()
result.append(port)
except (OSError, serial.SerialException):
pass
return result
if __name__ == '__main__':
print(serial_ports())
发布于 2015-11-12 11:44:17
您可以使用:
python -c "import serial.tools.list_ports;print serial.tools.list_ports.comports()"
按已知端口过滤:python -c "import serial.tools.list_ports;print [port for port in serial.tools.list_ports.comports() if port[2] != 'n/a']"
点击此处查看更多信息:https://pyserial.readthedocs.org/en/latest/tools.html#module-serial.tools.list_ports
发布于 2014-07-13 14:21:25
对Thomas的优秀答案的一个可能的改进是让Linux和可能的OSX也尝试开放端口,并只返回那些可以打开的端口。这是因为Linux至少在/dev/中以文件的形式列出了大量端口,这些端口没有连接到任何东西。如果您在终端中运行,则/dev/tty是您正在工作的终端,打开和关闭它可能会使您的命令行变得混乱,因此glob被设计为不会这样做。代码:
# ... Windows code unchanged ...
elif sys.platform.startswith ('linux'):
temp_list = glob.glob ('/dev/tty[A-Za-z]*')
result = []
for a_port in temp_list:
try:
s = serial.Serial(a_port)
s.close()
result.append(a_port)
except serial.SerialException:
pass
return result
对Thomas代码的这一修改仅在Ubuntu 14.04上进行了测试。
https://stackoverflow.com/questions/12090503
复制相似问题