Windows 11下使用PySerial连接USB设备时无法找到正确端口
Windows 11下USB设备通信问题(PySerial不适用时的解决方案)
为什么PySerial无法直接使用?
PySerial是专门用于**串口设备(含USB转串口芯片的设备)**的通信库,你的设备未被识别为COM端口,说明它属于纯USB设备而非串口类设备,因此PySerial无法直接适配。
解决步骤
1. 先排查驱动问题
- 打开设备管理器,查看是否有带黄色感叹号的设备(通常在「其他设备」或「通用串行总线控制器」分类下)。
- 如果有,右键选择「更新驱动程序」,手动指定设备厂商提供的驱动文件。部分USB设备需要安装厂商驱动后才会被识别为COM端口(如CH340、PL2303等USB转串口芯片)。
2. 确认设备类型与替代库
如果驱动安装后仍未出现COM端口,说明是纯USB设备,需根据设备类别选择对应库:
情况A:自定义USB协议设备 → 使用pyusb
pyusb可以直接与USB设备底层通信,需要配合libusb后端:
- 安装依赖:
pip install pyusb - 下载libusb的Windows二进制文件,将其中的
libusb-1.0.dll放到系统路径(如C:\Windows\System32)或项目目录中。 - 示例代码(需替换设备的VID和PID,从USB Device Tree Viewer中获取):
import usb.core import usb.util # 替换为你的设备VID和PID(十六进制) VENDOR_ID = 0xXXXX PRODUCT_ID = 0xXXXX # 查找设备 dev = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID) if not dev: raise Exception("未找到目标USB设备") # 释放内核驱动(若设备被系统占用) if dev.is_kernel_driver_active(0): dev.detach_kernel_driver(0) # 激活设备配置 dev.set_configuration() # 获取通信端点(需根据设备协议调整) cfg = dev.get_active_configuration() interface = cfg[(0, 0)] # 找到输出端点(发送数据到设备) out_ep = usb.util.find_descriptor( interface, custom_match=lambda e: usb.util.endpoint_direction(e.bEndpointAddress) == usb.util.ENDPOINT_OUT ) # 找到输入端点(从设备读取数据) in_ep = usb.util.find_descriptor( interface, custom_match=lambda e: usb.util.endpoint_direction(e.bEndpointAddress) == usb.util.ENDPOINT_IN ) # 发送数据 out_ep.write(b"your_command_here") # 读取数据(参数为端点地址和读取长度,需调整) received_data = dev.read(in_ep.bEndpointAddress, 64) print(received_data)
情况B:HID类设备 → 使用hidapi
如果设备属于人机接口设备(如键盘、鼠标类自定义设备),hidapi更易用:
- 安装依赖:
pip install hidapi - 示例代码(替换VID和PID):
import hid # 替换为你的设备VID和PID VENDOR_ID = 0xXXXX PRODUCT_ID = 0xXXXX # 打开设备并通信 with hid.Device(vid=VENDOR_ID, pid=PRODUCT_ID) as device: # 发送数据:第一个字节通常为报告ID(无报告ID则填0),后续为数据 device.write([0x00] + list(b"your_command")) # 读取数据(参数为读取长度) received_data = device.read(64) print(received_data)
3. 关键信息获取
从USB Device Tree Viewer中提取设备的VID(厂商ID)和PID(产品ID),这是所有USB通信库识别设备的核心参数。同时需参考设备厂商提供的通信协议文档,确保发送/接收的数据格式符合设备要求。
内容的提问来源于stack exchange,提问作者frogmasta
相关产品推荐
相关产品推荐

