2016-05-10 8 views
1

Я использую PyUSB в Python, так как мне придется слушать USB-порт для извлечения данных с электронной карты. На данный момент я должен тренироваться, читая прямой ввод с небольшой клавиатуры (с USB-подключением), подключенной к малине-пи. Конечно, я не хочу читать типизированную строку, я ожидаю получить коды ASCII, например. Я просто не понимаю, как я могу читать ввод с моей USB-клавиатуры.Как я могу получить необработанные данные USB-клавиатуры с Python?

я уже нашел некоторые фрагменты:

import usb.core 
import usb.util 

VENDOR_ID = 0x0922 
PRODUCT_ID = 0x8003 

# find the USB device 
device = usb.core.find(idVendor=VENDOR_ID, 
         idProduct=PRODUCT_ID) 

# use the first/default configuration 
device.set_configuration() 
# first endpoint 
endpoint = device[0][(0,0)][0] 

# read a data packet 
attempts = 10 
data = None 
while data is None and attempts > 0: 
    try: 
     data = device.read(endpoint.bEndpointAddress, 
          endpoint.wMaxPacketSize) 
    except usb.core.USBError as e: 
     data = None 
     if e.args == ('Operation timed out',): 
      attempts -= 1 
      continue 

print data 

Либо я получаю ошибку 16 «Устройство не занят» или вообще ничего, если я раскомментируйте следующую строку «device.set_configuration()», который вызывает «Device (я заменил VENDOR_ID и PRODUCT_ID на идентификаторы моей клавиатуры)

+0

Устройство используется ОС в качестве устройства ввода. Вы не можете использовать его непосредственно тогда. Вы не указали какую-либо информацию о ОС. –

+0

Есть ли способ отделить его от временного ядра, чтобы использовать его в моем приложении python? –

+0

См. Методы 'is_kernel_driver_active' и' detach_kernel_driver' класса устройств USB. В документации libusb это немного обсуждается. – patthoyts

ответ

2

Я предполагаю, что вы используете Linux, как вы упомянули о малине Pi. Вы можете использовать python-evdev для чтения данных с устройств событий в /dev/input/.

Например:

from evdev import InputDevice, categorize, ecodes 

device = InputDevice("/dev/input/event3") # my keyboard 
for event in device.read_loop(): 
    if event.type == ecodes.EV_KEY: 
     print(categorize(event)) 

Выход:

key event at 1462881252.506405, 30 (KEY_A), up 
key event at 1462881252.541371, 31 (KEY_S), up 
key event at 1462881252.616399, 31 (KEY_S), down 
key event at 1462881252.674422, 22 (KEY_U), down 
key event at 1462881252.730418, 31 (KEY_S), up 
key event at 1462881252.745558, 22 (KEY_U), up 
key event at 1462881252.808419, 50 (KEY_M), down 
key event at 1462881252.914552, 23 (KEY_I), down 
key event at 1462881252.925388, 50 (KEY_M), up 
key event at 1462881253.003579, 49 (KEY_N), down 
key event at 1462881253.066418, 34 (KEY_G), down 
+0

На самом деле работает с моей клавиатурой как event0, спасибо, работал как шарм! : D –

+0

Без проблем, рад, что я мог бы помочь :) –

 Смежные вопросы

  • Нет связанных вопросов^_^