使用Python列出串行端口
在这篇文章中,我们将讨论使用串行或com端口的通信。我们将深入探讨Python软件包,以帮助我们获得系统的可用通信端口。
稍后,我们将回顾使用Python搜索并获得可用串口的详细信息的一些技术。
简要介绍 COM 端口
一个COM端口是一个I/O接口,它使串行设备与计算机的连接成为可能。它是通信端口的简称。
COM端口有时也被称为串行端口。在新的计算机和设备上,COM端口已不再常用,但许多旧的串行端口设备仍在使用。
因此,我们有时可能需要进行串行通信,并为几个串行操作列出这些端口。
在Python中获取可用串口的列表
有时在编程时,我们需要获得我们系统中可用的通信端口的信息。我们将讨论如何用Python做这件事。
Python提供了pySerial
模块,它提供了对串行端口和相关信息的访问。我们首先需要在我们的项目中安装软件包pySerial
,然后我们就可以很容易地使用它的功能。
要安装这个包,我们必须在Python命令终端输入pip install pyserial
,然后按回车键。这个包就可以使用了。
现在,让我们看看下面列出串口的代码:
import serial.tools.list_ports
ports = []
for port in serial.tools.list_ports.comports():
ports.append(port.name)
print(ports)
输出:
['COM1']
让我们来讨论一下我们在代码中做了什么。我们必须写import serial
来使用已安装的软件包。
包pySerial
有一个comports()
方法,它返回可用的COM端口的列表。这个列表中的每个对象都是类型ListPortInfo
。
我们将在文章的后面讨论这个ListPortInfo
对象的内容。
comports()
函数在模块list_ports,
中,该模块在tools
中。所以我们通过写import serial.tools.list_ports
来导入整个模块。
然后我们只需在comports()
函数返回的列表上运行一个for
循环,并将端口追加到我们的列表中。
上述代码可以通过使用 Python 列表理解来更简单地编写。两种代码的输出结果都是一样的。下面是方法。
import serial.tools.list_ports
print([port.device for port in serial.tools.list_ports.comports()])
获取一个串行端口的列表以及它们的详细信息
正如我们所讨论的,comports()
函数返回端口的列表,列表中的每个对象都是ListPortInfo
。这个对象持有关于串行端口的信息,并提供索引访问以检索串行端口的设备(全名/路径)、描述和hwid
。
索引0将给我们提供设备的值,描述在索引1,而索引2将分享端口的hwid
。
下面是ListPortInfo
对象可以给我们的关于COM端口的详细信息:
对象 | 描述 |
---|---|
device |
完整的设备名称/路径。当通过索引访问时,这将作为第一个元素返回。 |
name |
简短的设备名称。 |
description |
人类可读的描述。当通过索引访问时,这将作为第二个元素被返回。 |
hwid |
硬件ID。当被索引访问时,这将作为第三个元素返回。 |
vid |
USB供应商ID。 |
pid |
USB产品ID。 |
serial_number |
USB序列号,作为一个字符串。 |
location |
USB设备位置字符串。 |
manufacturer |
USB制造商字符串,由设备报告。 |
product |
USB产品字符串,由设备报告。 |
interface |
界面特定的描述。 |
注意:支持仅限于少数操作系统。
description
和hwid
可能不是在所有系统上都可用。
现在,让我们写一段代码来获取所有可用的com端口的列表,以及它们的name
,description
,manufacturer
, 和hwid
。
import serial.tools.list_ports
port_data = []
for port in serial.tools.list_ports.comports():
info = dict({"Name": port.name, "Description": port.description, "Manufacturer": port.manufacturer,
"Hwid": port.hwid})
port_data.append(info)
print (port_data)
输出:
[{'Name': 'COM1', 'Description': 'Communications Port (COM1)', 'Manufacturer': '(Standard port types)',
'Hwid': 'ROOT\PORTS\0000'}]
按名称搜索一个串行端口
当我们的计算机有多个端口时,这个功能很有用。如果我们需要任何特定的端口,我们可以根据我们的选择通过它的名字或描述来搜索它。
让我们在Python中创建一个函数,它将返回一个给定名称的端口。
import serial.tools.list_ports
def get_port_by_name(port_name):
for port in serial.tools.list_ports.comports():
if port.name == port_name:
return port
print(get_port_by_name("COM1").description)
输出:
Communications Port (COM1)
代码很容易掌握。在我们的函数中,一个for
循环在由comports()
函数返回的端口列表上运行。
我们在循环中验证每个端口的名称,看它是否与用户的输入相匹配。如果符合,我们就返回该端口。
你可以为description
构建一个类似的函数,它将通过检查描述来返回端口。