2011-11-23 2 views
1

Python을 사용하여 ioctl을 사용하여 USB 센서에 쓰려고합니다. 필자는 직접 또는 pyusb를 통해 또는 간단한 파일 쓰기를 통해 장치로부터 많은 독서 사례를 보았지만 그 이상의 복잡한 것은 레이더에서 사라졌습니다.ioctl을 사용하여 Python으로 USB 장치에 쓰기

내가 기능보고 메시지를 작성하는 control_transfer를 사용할 필요가

명령은 ioctl(devicehandle, Operation, Args)

내가 올바른 동작을 결정하는 가지고있는 문제입니다. Args, 장치의 기능 보고서가 들어있는 버퍼 여야한다고 생각합니까? 플러스 진정한

어떤 도움이나 조언으로 설정 변경 가능한 플래그는 크게는

을받은 것

내가 추가해야합니다; 파이썬을 사용하는 이유는 코드가 장치 독립적이어야한다는 것입니다.

답변

0

설명서에 따르면 fcntl 모듈의 ioctl()은 유닉스에만 해당하므로 Windows에서는 작동하지 않습니다. 비슷하게 작동하는 DeviceIoControl()이라는 Windows 변형이있는 것으로 보입니다.

IOCTL은 장치 드라이버 나 운영 체제에 의해 선언되므로 다른 운영 체제에서 동일한 작업 ID (IOCTL 번호)와 동일한 매개 변수가있는 IOCTL 작업이 있는지 의심 스럽습니다.

Linux의 경우 헤더 파일에서 특정 장치 드라이버 또는 유효한 IOCTL에 대한 일부 USB 코어 헤더 파일을 검사 할 수 있습니다.

+0

장치에 독립적으로, 나는 LINUX 프로세서 변형 안에서 말 했어야합니다. USB 장치 공급 업체는 특히 도움이되지 않지만 상황을 푸는 데 유용합니다. 불행히도 USB 논쟁은 아주 드물다. –

4

좋은 예는 linuxdvb와 V4l2에 대한 파이썬 바인딩입니다. http://pypi.python.org/pypi/linuxdvbhttp://pypi.python.org/pypi/v4l2이지만 매우 pythonic하지 않습니다. Linux/Unix 시스템에서만 작동합니다.

구조체를 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 */ 

에 해당하는

당신은 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 
관련 문제