75 lines
2.1 KiB
Python
Executable File
75 lines
2.1 KiB
Python
Executable File
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()
|