使用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核心头文件。