Python自动选择串口(适用于Arduino)

Nyx*_*nyx 19 python serial-port arduino pyserial python-2.7

目前,在Python可以与设备通信之前,python程序必须知道设备(Arduino)所在的端口.

问题:每当设备插入并重新插入时,其COM端口都会发生变化,因此必须再次向Python提供正确的串行端口才能找到该设备.

Python(使用pySerial)如何自动搜索要使用的正确串口?python是否可以将串口上的设备正确识别为Arduino?

Mat*_*ams 27

使用以下代码查看所有可用的串行端口:

import serial.tools.list_ports
ports = list(serial.tools.list_ports.comports())
for p in ports:
    print p
Run Code Online (Sandbox Code Playgroud)

这给了我以下内容:

('COM4', 'Arduino Due Programming Port (COM4)', 'USB VID:PID=2341:003D SNR=75330303035351300230')
('COM11', 'RS-232 Port (COM11)', 'FTDIBUS\\VID_0856+PID_AC27+BBOPYNPPA\\0000')
Run Code Online (Sandbox Code Playgroud)

如果它是一个Arduino,你可以做类似的事情:

    if "Arduino" in p[1]:
        print "This is an Arduino!"
Run Code Online (Sandbox Code Playgroud)

  • `p [1]`更好拼写`p.description` (4认同)
  • 这也适用于 Linux,即使端口具有不同的名称并且“Arduino”不在“p.description”中。相反,“p.manufacturer”包含“Arduino”,“p.serial_number”告诉我哪个是哪个:-) (3认同)

Eri*_*ric 14

使用serial.tools.list_ports.comports,我们可以找到并连接到arduino:

import warnings
import serial
import serial.tools.list_ports

arduino_ports = [
    p.device
    for p in serial.tools.list_ports.comports()
    if 'Arduino' in p.description  # may need tweaking to match new arduinos
]
if not arduino_ports:
    raise IOError("No Arduino found")
if len(arduino_ports) > 1:
    warnings.warn('Multiple Arduinos found - using the first')

ser = serial.Serial(arduino_ports[0])
Run Code Online (Sandbox Code Playgroud)

如果你知道你每次找一模一样的Arduino的,你可以筛选p.serial_number代替

import serial.tools.list_ports

def find_arduino(serial_number):
    for pinfo in serial.tools.list_ports.comports():
        if pinfo.serial_number == serial_number:
            return serial.Serial(pinfo.device)
    raise IOError("Could not find an arduino - is it plugged in?")

ser = find_arduino(serial_number='85430353531351B09121')
Run Code Online (Sandbox Code Playgroud)