Сканер штрих-кода PyUsb USB

Я пытаюсь вывести строку из штрих-кода или qrcode с помощью сканера Honeywell USB 3310g в Ubuntu. У меня есть libusb и библиотека под названием metro-usb (http://gitorious.org/other/metro-usb), которые позволяют моему сканеру работать. Если я открою gedit и просканирую, я успешно получу данные qrcode в порядке! Мне нужно уметь создавать это прагматично и отправлять данные в веб-службу.

Я загрузил и установил pyusb, и это, кажется, лучшее решение из моих исследований. У меня есть сценарий, основанный на том, что я нашел в Интернете, который ждет сканирования и даже успешно дает мне результат. однако я не знаю, как читать данные. Я получаю массив данных, которые на самом деле не имеют никакого смысла. Я тоже не знаком с программированием USB или Python. Может ли кто-нибудь указать мне, как лучше всего просто получить строку данных из сканирования штрих-кода USB? С остальным, скорее всего, я смогу разобраться. Кроме того, я получаю сообщение об ошибке, которое мне всегда нужно закомментировать, чтобы запустить программу, когда я пытаюсь set_configuration. Я всегда получаю сообщение об ошибке, что ресурс занят ... не уверен, имеет ли это какое-либо отношение к этому ... Я получил этот скрипт из Интернета, а также идентификатор продукта и идентификатор поставщика из моей команды lsusb. Когда я запускаю это с закомментированным set_configuration, я получаю:

Waiting to read...

При сканировании:

0x0 0x0 0xb 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x17 0x0 0x0 0x0 0x0 0x0
Traceback (most recent call last):
  File "reader.py", line 81, in <module>
  print lecture_code_barre()
File "reader.py", line 76, in lecture_code_barre
lecture+=NO_SCAN_CODE[data[n+2]]
KeyError: 11

Вот сценарий py:

import sys
import usb.core
import usb.util

def lecture_code_barre():
VENDOR_ID = 0x0c2e
PRODUCT_ID = 0x0b61
#VENDOR_ID = 0x04b4
#PRODUCT_ID = 0x0100
DATA_SIZE = 16 # 224
NO_SCAN_CODE = {0x1E:'1', 0x1F:'2', 0x20:'3', 0x21:'4', 0x22:'5', 0x23:'6', 0x24:'7'
    , 0x25:'8', 0x26:'9', 0x27:'0', 0x28:''} # 28=enter

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

if device is None:
    sys.exit("Could not find Id System Barcode Reader.")

if device.is_kernel_driver_active(0):   # On détache le périphérique du kernel, plus d'envoi sur stdin
    try:
        device.detach_kernel_driver(0)
    except usb.core.USBError as e:
        sys.exit("Could not detatch kernel driver: %s" % str(e))

#try:
#    device.set_configuration()
#    device.reset()
#except usb.core.USBError as e:
#    sys.exit("Could not set configuration: %s" % str(e))

endpoint = device[0][(0,0)][0]
data = []
lu = False
print "Waiting to read..."
lecture=''

while 1:
    try:
        data += device.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize)

        if not lu:
            print "Waiting to read..."
        lu = True

    except usb.core.USBError as e:
        if e.args == (110,'Operation timed out') and lu:
            if len(data) < DATA_SIZE:
                print "Lecture incorrecte, recommencez. (%d bytes)" % len(data)
                print "Data: %s" % ''.join(map(hex, data))
                data = []
                lu = False
                continue
            else:
                for n in range(0,len(data),16):
                    print ' '.join(map(hex,data[n:n+16]))
                    lecture+=NO_SCAN_CODE[data[n+2]]
                break   # Code lu
return lecture

if __name__ == '__main__':
print lecture_code_barre()

Выход из устройства с зацикливанием:

....
print device.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize)
...

parallels@ubuntu:~/Documents/pyusb$ sudo python scan.py 
<usb.core.Device object at 0x7fa5f34df610>
array('B', [0, 0, 38, 0, 0, 0, 0, 0])
array('B', [2, 0, 0, 0, 0, 0, 0, 0])
array('B', [2, 0, 11, 0, 0, 0, 0, 0])
array('B', [2, 0, 22, 0, 0, 0, 0, 0])
array('B', [0, 0, 0, 0, 0, 0, 0, 0])
array('B', [0, 0, 81, 0, 0, 0, 0, 0])
array('B', [2, 0, 0, 0, 0, 0, 0, 0])
array('B', [2, 0, 24, 0, 0, 0, 0, 0])
array('B', [2, 0, 14, 0, 0, 0, 0, 0])
array('B', [0, 0, 0, 0, 0, 0, 0, 0])
array('B', [0, 0, 81, 0, 0, 0, 0, 0])
array('B', [0, 0, 11, 0, 0, 0, 0, 0])
array('B', [0, 0, 23, 0, 0, 0, 0, 0])
array('B', [0, 0, 0, 0, 0, 0, 0, 0])
array('B', [0, 0, 23, 0, 0, 0, 0, 0])
array('B', [0, 0, 19, 0, 0, 0, 0, 0])
array('B', [2, 0, 0, 0, 0, 0, 0, 0])
array('B', [2, 0, 51, 0, 0, 0, 0, 0])
array('B', [0, 0, 0, 0, 0, 0, 0, 0])
array('B', [0, 0, 56, 0, 0, 0, 0, 0])
array('B', [0, 0, 0, 0, 0, 0, 0, 0])
array('B', [0, 0, 56, 0, 0, 0, 0, 0])
array('B', [0, 0, 26, 0, 0, 0, 0, 0])
array('B', [0, 0, 0, 0, 0, 0, 0, 0])
array('B', [0, 0, 26, 0, 0, 0, 0, 0])
array('B', [0, 0, 0, 0, 0, 0, 0, 0])
array('B', [0, 0, 26, 0, 0, 0, 0, 0])
array('B', [0, 0, 55, 0, 0, 0, 0, 0])
array('B', [0, 0, 5, 0, 0, 0, 0, 0])
array('B', [0, 0, 21, 0, 0, 0, 0, 0])
array('B', [0, 0, 18, 0, 0, 0, 0, 0])
array('B', [0, 0, 26, 0, 0, 0, 0, 0])
array('B', [0, 0, 17, 0, 0, 0, 0, 0])
array('B', [0, 0, 5, 0, 0, 0, 0, 0])
array('B', [0, 0, 18, 0, 0, 0, 0, 0])
array('B', [0, 0, 0, 0, 0, 0, 0, 0])
array('B', [0, 0, 18, 0, 0, 0, 0, 0])
array('B', [0, 0, 14, 0, 0, 0, 0, 0])
array('B', [0, 0, 55, 0, 0, 0, 0, 0])
array('B', [0, 0, 17, 0, 0, 0, 0, 0])
array('B', [0, 0, 8, 0, 0, 0, 0, 0])
array('B', [0, 0, 23, 0, 0, 0, 0, 0])
array('B', [0, 0, 81, 0, 0, 0, 0, 0])
array('B', [0, 0, 22, 0, 0, 0, 0, 0])
array('B', [0, 0, 8, 0, 0, 0, 0, 0])
array('B', [0, 0, 21, 0, 0, 0, 0, 0])
array('B', [0, 0, 25, 0, 0, 0, 0, 0])
array('B', [0, 0, 12, 0, 0, 0, 0, 0])
array('B', [0, 0, 6, 0, 0, 0, 0, 0])
array('B', [0, 0, 8, 0, 0, 0, 0, 0])

person Michael    schedule 29.01.2013    source источник
comment
Он не показывает себя как HID-устройство?   -  person Ignacio Vazquez-Abrams    schedule 29.01.2013
comment
Я считаю, что это так, я могу увидеть это в lsusb. Я просто не могу / не уверен, как интерпретировать вывод сканирования через pyusb / python.   -  person Michael    schedule 29.01.2013
comment
Для HID-устройств не требуется libusb, и не все USB-устройства являются HID-устройствами.   -  person Ignacio Vazquez-Abrams    schedule 29.01.2013
comment
Просканируйте PAP131., Используйте подсистему событий и создайте дамп libusb.   -  person Ignacio Vazquez-Abrams    schedule 29.01.2013
comment
Я не совсем понимаю, что вы имеете в виду, говоря «Сканировать PAP131». Извините, я не очень хорошо знаком с программированием USB. У меня создалось впечатление, что мне нужно использовать libusb для взаимодействия с устройством.   -  person Michael    schedule 29.01.2013
comment
@Michael См. Стр. 2 - 3 руководства в разделе USB HID - там есть штрих-код для программирования вашего сканера на использование HID.   -  person Alex L    schedule 30.01.2013
comment
@AlexL Спасибо. Я это вижу, поэтому, когда я программирую его для USB HID, что это означает для доступа к устройству через PyUsb / Python и интерпретации данных?   -  person Michael    schedule 30.01.2013


Ответы (2)


Возьмите Краткое руководство, отсканируйте "USB Штрих-код в режиме «Серийный», затем штрих-код «Сохранить», чтобы сделать эту настройку постоянной. Теперь ваш 3310g находится в режиме эмуляции serail, обратите внимание на новое устройство / dev / ttyACM0 или / dev / ttyUSB0. Чтение последовательного порта с помощью простых файловых операций из python:

f = open('/dev/ttyACM0')
print f.read(13)
person Pashka    schedule 30.01.2013
comment
Это прекрасно работает! Единственная проблема в том, что каждый раз, когда я сканирую новый код, я получаю ТОЛЬКО первые 13 символов. Я знаю, что это требует дополнительных исследований и изучения Python, но можно ли интерпретировать либо только последнюю строку, либо ТОЛЬКО данные текущего сканирования? - person Michael; 31.01.2013
comment
Нашел это сообщение в блоге, которое направляет меня в правильном направлении. stealth- x.com/programming/driver-writing-with-python.php Большое спасибо за помощь! - person Michael; 31.01.2013
comment
Вы можете разделить коды возвратом каретки. Используйте Руководство по быстрому запуску, чтобы отсканировать соответствующий код с названием Добавить суффикс CR в разделе суффиксов. После этого вы можете прочитать цикл по 1 символу, ожидая CR (# 13) в конце каждого штрих-кода. - person Pashka; 31.01.2013
comment
Ссылка на руководство по быстрому запуску не работает - person user2682863; 12.01.2017

Вы получаете сообщение об ошибке из этой строки:

lecture+=NO_SCAN_CODE[data[n+2]]

и data[n+2] = 11, что равносильно выполнению следующего

NO_SCAN_CODE[11]

NO_SCAN_CODE - это словарь, который содержит значения только для ключей [30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40], но не 11.

Тот факт, что вы получаете эту ошибку, означает, что вы получили usb.core.USBError и len(data) >= DATA_SIZE.


Если бы я отлаживал это, я бы добавил намного больше операторов печати. Я предлагаю сначала попробовать что-нибудь простое, а затем добавить больше логики, когда вы выясните, что возвращает устройство:

# Initialise variables
VENDOR_ID = 0x0c2e
PRODUCT_ID = 0x0b61

# Set up device
device = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID)
print device

# Do more setup things here
# detach_kernel_driver and set_configuration ?
# Perhaps try these in combination with reading the usb.core documentation, and see what happens?

# Loop 10 times (to start with - try more later?)
for i in range(10):
    # Don't catch any errors, just print what the device is returning
    print device.read(endpoint.bEndpointAddress, endpoint.wMaxPacketSize)
person Alex L    schedule 29.01.2013
comment
Спасибо, попробовал. Вот результат, который я сделал с 20 и смог сделать несколько сканирований во время его работы: parallels @ ubuntu: ~ / Documents / pyusb $ sudo python scan.py ‹usb.core.Device объект в 0x7f0684810610› array ('B ', [0, 0, 18, 0, 0, 0, 0, 0]) array (' B ', [0, 0, 14, 0, 0, 0, 0, 0]) ... на 18 больше, чем заканчивается. Я не совсем уверен, что это означает, это в основном тот же результат, что и у меня в первый раз, но я не уверен, как получить значение из кода из этого? Спасибо! - person Michael; 29.01.2013
comment
@Michael Знаете ли вы, какие ценности вы ожидаете получить? Не могли бы вы добавить к своему вопросу полный вывод? - person Alex L; 29.01.2013
comment
Думаю, это может быть частью проблемы. Я не знаю, что я должен или собираюсь получить. Я просматривал этот документ: honeywellaidc.com/ CatalogDocuments / Но я не могу определить, как анализировать вывод. Я добавляю к вопросу полный вывод. Спасибо! - person Michael; 29.01.2013