Запись на USB-устройство с Python с использованием ioctl - PullRequest
1 голос
/ 23 ноября 2011

Используя Python, я пытаюсь записать на USB-датчик с помощью ioctl.У меня есть множество примеров чтения с устройств напрямую или через pyusb, или простых файловых записей, но все более сложное исчезает с радаров.

Мне нужно использовать control_transfer для написания сообщения отчета о функции

Команда: ioctl(devicehandle, Operation, Args)

У меня проблема с определением правильной операции.Args, я полагаю, должен быть буфером, содержащим отчет о функциях для устройства?плюс флаг Mutable, установленный в true

Любая помощь или совет будут очень полезны

Я должен добавить;причина использования Python заключается в том, что код должен быть независимым от устройства.

Ответы [ 2 ]

5 голосов
/ 30 марта 2012

Хорошим примером является привязка Python для linuxdvb и V4l2.http://pypi.python.org/pypi/linuxdvb и http://pypi.python.org/pypi/v4l2 но они не очень питонны.Работает только с системой Linux / Unix.

Вы должны перевести структуру ARGS в нечто понятное Python с помощью ctype.Значение 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 соответствующий Ctype дляstruct operation_arg.Это даст такой код

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
0 голосов
/ 23 ноября 2011

Согласно документации, ioctl() в модуле fcntl зависит от Unix, поэтому он не будет работать в Windows.Кажется, существует вариант Windows с именем DeviceIoControl(), который работает аналогично.

IOCTL объявляются драйвером устройства или операционной системой, поэтому я очень сомневаюсь, что существуют операции IOCTL с одинаковым идентификатором операции (IOCTLчисло) и одинаковые параметры в разных операционных системах.

Для Linux вы можете проверить заголовочные файлы для конкретных драйверов устройств или, возможно, некоторые заголовочные файлы ядра USB для действительных IOCTL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...