[原创]PyQT下枚举USB串口/CH340/PL2303等设备

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ysgjiangsu/article/details/84667996

首先,在Python中,可通过import serial相关库来使用串口

import serial
import serial.tools.list_ports

获取所有连接PC的串口方法是:

self.scomList = list(serial.tools.list_ports.comports())

不妨打印一下上面的list,结果如下:

[<serial.tools.list_ports_common.ListPortInfo object at 0x00000255910D1C50>,
 <serial.tools.list_ports_common.ListPortInfo object at 0x00000255910D1DD8>]

串口信息在哪?我们可以打个断电,看一下
在这里插入图片描述
观察变量a
在这里插入图片描述
发现了期待的COM9和COM3,可是怎么获取到这个名字呢?
再展开看
在这里插入图片描述
在a[0],a[1]的类型是
‘serial.tools.list_ports_common.ListPortInfo’,其实就是个字典,这个字典里存放了关于设备的所有信息,包含description、device、hwid等。因此,可以先根据description过滤掉非USB-SERIAL设备,然后再通过device获取设备端口号,不就搞定了?
代码如下:

def funcCom(arrContent):
    return "USB-SERIAL" in arrContent.description
filter(funcCom,self.scomList)

再看self.scomList,发现还是老样子,期望的值并没有被过滤出来。后来,发现filter是将过滤的结果返回了,并不会改变原来的值self.scomList。因此,代码修改如下:

def funcCom(arrContent):
    return "USB-SERIAL" in arrContent.description
b = filter(funcCom,self.scomList)

此时,将b打印输出看看

<filter object at 0x000002EE301A2D68>

总感觉哪里不对劲,b应该是一个包含USB串口信息的list,怎么会是个filter?
原来,filter返回的是个迭代器,它并不会立即执行,而是在运行它的时候才执行。怎么理解?
廖大神是这样解释filter的:
注意到filter()函数返回的是一个Iterator,也就是一个惰性序列,所以要强迫filter()完成计算结果,需要用list()函数获得所有结果并返回list
豁然开朗,点个赞!

  • USB设备信息,如何抓取设备名称
def ComAutoFind(self):
//先获取所以有USB串口挂载的设备
    self.scomList = list(serial.tools.list_ports.comports())

    if(len(self.scomList) <= 0):
        self.ShowMessageBox("未发现Modbus接口,请检查线缆连接")
    else:
        comNum = len(self.scomList)
        print(str(comNum) + 'Com is found')

        def funcCom(arrContent):
            return "USB-SERIAL" in arrContent.description
		
		//通过filter函数筛选出设备描述里包含USB-SERIAL的设备
        b = list(filter(funcCom,self.scomList))
        comNum = len(b)
        print(str(comNum) + 'USBCom is found')

        while comNum:
            comNum = comNum - 1
            self.usbComList.append(b[comNum].device)

        self.comboBox_Port.addItems(self.usbComList)
        print(self.usbComList)

我把获取到的设备列表,直接添加到了UI的comboBox中,这样就做到了自动枚举自动过滤的功能了

好,本篇结束


在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ysgjiangsu/article/details/84667996
今日推荐