Python 如何使用相同的功能动态连接到COM端口上的不同设备?

Python 如何使用相同的功能动态连接到COM端口上的不同设备?,python,serial-port,pyserial,Python,Serial Port,Pyserial,我有两个设备,每个都有usb串行接口。usb串行连接允许访问3个COM端口,以便与每个设备上的不同芯片进行通信。 我想创建一个函数initialise(),自动扫描并连接到尚未使用的设备的COM端口 我目前有以下功能,但当我运行两次该功能时,它无法连接到第二个设备,我现在被卡住了,所以我需要一个聪明的建议 def initialise(): PORTMAPPINGWIN = {'fwmain': ('COM8','COM12','COM4'), '

我有两个设备,每个都有usb串行接口。usb串行连接允许访问3个COM端口,以便与每个设备上的不同芯片进行通信。 我想创建一个函数
initialise()
,自动扫描并连接到尚未使用的设备的COM端口

我目前有以下功能,但当我运行两次该功能时,它无法连接到第二个设备,我现在被卡住了,所以我需要一个聪明的建议

def initialise():
    PORTMAPPINGWIN = {'fwmain': ('COM8','COM12','COM4'),
                    'fwutil': ('COM9','COM13','COM5'),
                    'fwcif': ('COM10','COM14','COM6')}
    PORTMAPPINGMAC = {'fwmain': ('/dev/tty.usbserial-000013FAB','/dev/tty.usbserial-12345B'),
                    'fwutil': ('/dev/tty.usbserial-000013FAC','/dev/tty.usbserial-12345C'),
                    'fwcif': ('/dev/tty.usbserial-000013FAD','/dev/tty.usbserial-12345D')}

    if os.name == 'nt':
        _portmap = PORTMAPPINGWIN
    else:
        _portmap = PORTMAPPINGMAC

    _available = []

    _n = len(_portmap['fwmain'])
    for portaddress in range(_n):
        for termname in _portmap.keys():
            usb = _portmap[termname][portaddress]
            try:
                _ser = serial.Serial(usb, 115200)
                _ser.close()
                _available.append(usb)
            except serial.SerialException:
                pass


    _available.sort()
    if _available != [] and _available != None:
        if _available[0] == 'COM10': #TODO use a regex instead to replace all COM5 instances with COM05 so that we can sort properly list('COM5').insert(re.search(r'(?<=COM)\d', 'COM5').start(), '0')
            if len(_available) < 4:
                _available.insert(3, _available.pop(0))
            elif len(_available) < 7:
                _available.insert(6, _available.pop(0))
            elif len(_available) < 10:
                _available.insert(9, _available.pop(0))

    print([port for port in _available])

    if len(_available) > 3:
        _available = _available[:3]
def initialise():
PORTMAPPINGWIN={'fwmain':('COM8','COM12','COM4'),
‘fwutil’:(‘COM9’、‘COM13’、‘COM5’),
‘fwciff’:(‘COM10’、‘COM14’、‘COM6’)
PORTMAPPINGMAC={'fwmain':('/dev/tty.usbserial-000013FAB','/dev/tty.usbserial-12345B'),
'fwutil':('/dev/tty.usbserial-000013FAC','/dev/tty.usbserial-12345C'),
“fwcif”:(“/dev/tty.usbserial-000013FAD”,”/dev/tty.usbserial-12345D'))
如果os.name='nt':
_portmap=PORTMAPPINGWIN
其他:
_portmap=PORTMAPPINGMAC
_可用=[]
_n=len(_portmap['fwmain']))
对于范围内的portaddress(\n):
对于_portmap.keys()中的termname:
usb=_端口映射[termname][portaddress]
尝试:
_ser=串行。串行(usb,115200)
_塞尔克洛斯()
_可用。附加(usb)
除serial.SerialException外:
通过
_可用。排序()
如果可用!=[]和_可用!=无:

如果_available[0]==“COM10”:#TODO使用正则表达式替换所有COM5实例为COM05,以便我们可以对列表('COM5')进行正确排序。插入(re.search)(r'(?Hmmm.I将
除串行外。SerialException:
更改为
除异常外:
,现在它工作正常。 谢谢你

我认为这对于任何想在多个连接的设备上启动同一脚本的人来说都是一个很酷的过程。如果你不想预先指定设备所在的COM端口,你可以替换它

for portaddress in range(_n):
    for termname in _portmap.keys():
        usb = _portmap[termname][portaddress]
对于范围(255)内的usb,使用
:usb='COM'+str(usb)
或类似的东西