Find USB serial port with Python script

烂漫一生 提交于 2021-01-29 18:40:08

问题


I am trying to write a script in python so I can find in 1 sec the COM number of the USB serial adapter I have plugged to my laptop. What I need is to isolate the COMx port so I can display the result and open putty with that specific port. Can you help me with that?

Until now I have already written a script in batch/powershell and I am getting this information but I havent been able to separate the text of the COMx port so I can call the putty program with the serial parameter. I have also been able to find the port via Python but I cant isolate it from the string.

import re           # Used for regular expressions (unused)
import os           # To check that the path of the files defined in the config file exist (unused)
import sys          # To leave the script if (unused)
import numpy as np
from infi.devicemanager import DeviceManager
dm = DeviceManager()
dm.root.rescan()
devs = dm.all_devices
print ('Size of Devs: ',len(devs))
print ('Type of Devs: ',type(devs))
myarray = ([])
myarray =np.array(devs)
print ('Type of thing: ',type(myarray))
match = '<USB Serial Port (COM6)>' (custom match. the ideal would be "USB Serial Port")
i=0
#print (myarray, '\n')
while i != len(devs):
    if match == myarray[i]: 
        print ('Found it!')
        break
    print ('array: ',i," : ", myarray[i])
    i = i+1
print ('array 49: ', myarray[49]) (here I was checking what is the difference of the "element" inside the array)
print ('match   : ', match) (and what is the difference of what I submitted)
print ('end')

I was expecting the if match == myarray[i] to find the two elements but for some reason it doesnt. Its returning me that those two are not the same.

Thank you for any help in advance!

=== UPDATE === Full script can be found here https://github.com/elessargr/k9-serial


回答1:


this is a follow up answer from @MacrosG
i tried a minimal example with properties from Device

from infi.devicemanager import DeviceManager
dm = DeviceManager()
dm.root.rescan()
devs = dm.all_devices
print ('Size of Devs: ',len(devs))
for d in devs:
    if  "USB" in d.description :
         print(d.description)




回答2:


If Python says the strings are not the same I dare say it's quite likely they are not.

You can compare with:

if  "USB Serial Port" in devs[i]:

Then you should be able to find not a complete letter by letter match but one that contains a USB port.

There is no need to use numpy, devs is already a list and hence iterable.




回答3:


If you want to do this with regular-expressions:

def main():

    from infi.devicemanager import DeviceManager
    import re

    device_manager = DeviceManager()
    device_manager.root.rescan()

    pattern = r"USB Serial Port \(COM(\d)\)"

    for device in device_manager.all_devices:
        try:
            match = re.fullmatch(pattern, device.friendly_name)
        except KeyError:
            continue
        if match is None:
            continue
        com_number = match.group(1)
        print(f"Found device \"{device.friendly_name}\" -> com_number: {com_number}")

    return 0


if __name__ == "__main__":
    import sys
    sys.exit(main())

Output:

Found device "USB Serial Port (COM3)" -> com_number: 3



回答4:


Huge thanks to everyone and especially to bigdataolddriver since I went with his solution

Last thing!

for d in devs:
    if  "USB Serial Port" in d.description :
        str = d.__str__()
        COMport = str.split('(', 1)[1].split(')')[0]
        i=1
        break
    else:
        i=0

if i == 1:
    print ("I found it!")
    print(d.description, "found on : ", COMport)
    subprocess.Popen(r'"C:\Tools\putty.exe" -serial ', COMport)
elif i ==0:
    print ("USB Serial Not found \nPlease check physical connection.")
else:
    print("Error")

Any ideas how to pass the COMport to the putty.exe as a parameter?

===== UPDATE =====

if i == 1:
    print ("I found it!")
    print(d.description, "found on : ", COMport)
    command = '"C:\MyTools\putty.exe" -serial ' + COMport
    #print (command)
    subprocess.Popen(command)

Thank you everyone!



来源:https://stackoverflow.com/questions/57745554/find-usb-serial-port-with-python-script

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!