版权声明:本文为博主原创文章,未经博主允许不得转载。 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中,这样就做到了自动枚举自动过滤的功能了
好,本篇结束