75 lines
2.1 KiB
Python
75 lines
2.1 KiB
Python
|
|
import usb.core
|
|||
|
|
import usb.util
|
|||
|
|
|
|||
|
|
# USB设备参数
|
|||
|
|
VENDOR_ID = 0x0000 # 替换为实际的VID
|
|||
|
|
PRODUCT_ID = 0x0001 # 替换为实际的PID
|
|||
|
|
OUT_ENDPOINT = 0x01 # EP1 OUT端点
|
|||
|
|
IN_ENDPOINT = 0x82 # EP2 IN端点 (注意: IN端点通常最高位设为1)
|
|||
|
|
MAX_FIFO_SIZE = 64 # 最大FIFO长度
|
|||
|
|
|
|||
|
|
def find_usb_device():
|
|||
|
|
"""查找并返回指定的USB设备"""
|
|||
|
|
dev = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID)
|
|||
|
|
if dev is None:
|
|||
|
|
raise ValueError("设备未找到,请检查连接或VID/PID")
|
|||
|
|
return dev
|
|||
|
|
|
|||
|
|
def configure_device(dev):
|
|||
|
|
"""配置USB设备"""
|
|||
|
|
# 如果是Linux,可能需要先detach内核驱动
|
|||
|
|
# if dev.is_kernel_driver_active(0):
|
|||
|
|
# dev.detach_kernel_driver(0)
|
|||
|
|
|
|||
|
|
# 设置配置
|
|||
|
|
dev.set_configuration()
|
|||
|
|
|
|||
|
|
# 获取配置
|
|||
|
|
cfg = dev.get_active_configuration()
|
|||
|
|
intf = cfg[(0,0)]
|
|||
|
|
|
|||
|
|
print("设备配置成功")
|
|||
|
|
return dev
|
|||
|
|
|
|||
|
|
def send_data(dev, data):
|
|||
|
|
"""向OUT端点发送数据"""
|
|||
|
|
if len(data) > MAX_FIFO_SIZE:
|
|||
|
|
raise ValueError(f"数据长度超过最大FIFO大小({MAX_FIFO_SIZE}字节)")
|
|||
|
|
|
|||
|
|
# 发送数据到EP1 OUT
|
|||
|
|
bytes_written = dev.write(OUT_ENDPOINT, data)
|
|||
|
|
print(f"发送成功: {bytes_written} 字节")
|
|||
|
|
return bytes_written
|
|||
|
|
|
|||
|
|
def receive_data(dev, max_length=MAX_FIFO_SIZE):
|
|||
|
|
"""从IN端点接收数据"""
|
|||
|
|
# 从EP2 IN读取数据
|
|||
|
|
data = dev.read(IN_ENDPOINT, max_length)
|
|||
|
|
print(f"接收成功: {len(data)} 字节")
|
|||
|
|
return data
|
|||
|
|
|
|||
|
|
def main():
|
|||
|
|
try:
|
|||
|
|
# 查找并配置设备
|
|||
|
|
dev = find_usb_device()
|
|||
|
|
dev = configure_device(dev)
|
|||
|
|
|
|||
|
|
# 示例数据发送
|
|||
|
|
test_data = b"Hello USB Device!" # 测试数据
|
|||
|
|
send_data(dev, test_data)
|
|||
|
|
|
|||
|
|
# 示例数据接收
|
|||
|
|
received_data = receive_data(dev)
|
|||
|
|
print("接收到的数据:", received_data)
|
|||
|
|
|
|||
|
|
except usb.core.USBError as e:
|
|||
|
|
print(f"USB错误: {e}")
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"错误: {e}")
|
|||
|
|
finally:
|
|||
|
|
# 释放设备
|
|||
|
|
usb.util.dispose_resources(dev)
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
main()
|