使用Python,我正在尝试使用ioctl写入USB传感器。我有很多直接或通过pyusb从设备读取的例子,或简单的文件写入,但任何更复杂的东西都会从雷达中消失。
我需要使用control_transfer来编写功能报告消息
命令为ioctl(devicehandle, Operation, Args)
我遇到的问题是确定正确的操作。 Args,我认为应该是一个包含设备功能报告的缓冲区?加上Mutable标志设置为true
任何帮助或建议都将受到极大的欢迎
我应该补充;使用Python的原因是代码必须与设备无关。
答案 0 :(得分:5)
一个很好的例子是linuxdvb和V4l2的python绑定。 http://pypi.python.org/pypi/linuxdvb和http://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核心头文件。