使用ioctl使用Python写入USB设备

时间:2011-11-23 15:35:54

标签: python usb

使用Python,我正在尝试使用ioctl写入USB传感器。我有很多直接或通过pyusb从设备读取的例子,或简单的文件写入,但任何更复杂的东西都会从雷达中消失。

我需要使用control_transfer来编写功能报告消息

命令为ioctl(devicehandle, Operation, Args)

我遇到的问题是确定正确的操作。 Args,我认为应该是一个包含设备功能报告的缓冲区?加上Mutable标志设置为true

任何帮助或建议都将受到极大的欢迎

我应该补充;使用Python的原因是代码必须与设备无关。

2 个答案:

答案 0 :(得分:5)

一个很好的例子是linuxdvb和V4l2的python绑定。 http://pypi.python.org/pypi/linuxdvbhttp://pypi.python.org/pypi/v4l2但这些并不是非常pythonic。仅适用于Linux / Unix系统。

您必须在ARGS的帮助下将ctype结构转换为python可以理解的内容。 Operation值与C中的值相同。

对应C来电

struct operation_arg {
    int fields1;
    int fields2;
}

struct operation_arg Args; 
Args.field1 = data1;
Args.field2 = data2;

devicehandle = open("/dev/my_usb", O_RDWR); 

retval = ioctl(devicehandle, Operation, &Args);
/* check retval value */

你必须在python中定义struct operation_arg的对应Ctype。它会提供这种代码

import ctypes
import linuxdvb
import fcntl

class operation_arg(ctypes.Structure):
    _fields_ = [
        ('field1', ctypes.c_int),
        ('field2', ctypes.c_int)
    ]

Args = operation_args()
Args.field1 = data1;
Args.field2 = data2;

devicehandle = open('/dev/my_usb', 'rw')

# try:
fcntl.ioctl(devicehandle, operation, Args)
# exception block to check error

答案 1 :(得分:0)

根据文档,fcntl模块中的ioctl()是特定于unix的,因此它在Windows中不起作用。似乎有一个名为DeviceIoControl()的Windows变体,其工作方式类似。

IOCTL由设备驱动程序或操作系统声明,因此我非常怀疑IOCTL操作在不同的操作系统上具有相同的操作ID(IOCTL编号)和相同的参数。

对于Linux,您可以检查特定设备驱动程序的头文件,或者可能检查有效IOCTL的某些usb核心头文件。