用Python使用ioctl写入USB设备



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

我需要使用control_transfer来写Feature Report消息

命令为ioctl(devicehandle, Operation, Args)

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

任何帮助或建议都将非常欢迎

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

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

你必须在ctype的帮助下将ARGS结构翻译成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

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

IOCTL是由设备驱动程序或操作系统声明的,所以我非常怀疑在不同的操作系统上是否存在具有相同操作id (IOCTL号)和相同参数的IOCTL操作。

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

最新更新