簡體   English   中英

使用ioctl用Python寫入USB設備

[英]Writing to USB device with Python using ioctl

使用Python,我試圖使用ioctl寫入USB傳感器。 我有很多直接或通過pyusb從設備讀取數據的示例,或者簡單的文件寫入操作,但是更復雜的事情就不復存在了。

我需要使用control_transfer編寫功能報告消息

該命令是ioctl(devicehandle, Operation, Args)

我遇到的問題是確定正確的操作。 我認為Args應該是包含設備功能報告的緩沖區嗎? 加上將Mutable標志設置為true

任何幫助或建議將不勝感激

我應該補充; 使用Python的原因是代碼必須與設備無關。

一個很好的例子是linuxdvb和V4l2的python綁定。 http://pypi.python.org/pypi/linuxdvbhttp://pypi.python.org/pypi/v4l2,但這些並不是pythonic。 僅適用於Linux / Unix系統。

您必須借助ctypeARGS結構轉換為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,您可以檢查特定設備驅動程序的頭文件,或檢查某些USB核心頭文件的有效IOCTL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM