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

Я пытаюсь вывести строку из штрих-кода или 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 
  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)
...

[email protected]:~/Documents/pyusb$ sudo python scan.py 

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])
4
nl ja de
Я считаю, что это так, я могу видеть это в lsusb. Я просто не могу/не знаю, как интерпретировать вывод из сканирования через pyusb/python.
добавлено автор Michael, источник
Я не уверен, что вы подразумеваете под Scan «PAP131». Извините, я не очень хорошо знаком с USB-программированием. Мне показалось, что мне нужно использовать libusb для взаимодействия с устройством.
добавлено автор Michael, источник
@AlexL Спасибо. Я вижу это, поэтому, когда я «программирую его для USB HID» Что это значит для доступа к устройству через PyUsb/Python и для интерпретации данных?
добавлено автор Michael, источник
Он не показывает себя как устройство HID?
добавлено автор Ignacio Vazquez-Abrams, источник
HID-устройствам не требуется libusb, и не все USB-устройства являются устройствами HID.
добавлено автор Ignacio Vazquez-Abrams, источник
Сканируйте «PAP131.», Используйте подсистему событий и дамп libusb.
добавлено автор Ignacio Vazquez-Abrams, источник
Это в руководстве.
добавлено автор Ignacio Vazquez-Abrams, источник
@Michael См. Страницу 2 - 3 руководства, в разделе «USB HID» - есть штрих-код для программирования вашего сканера для использования HID.
добавлено автор Alex L, источник

2 ответы

Захватите Краткое руководство , сканирование "USB Serial "-mode штрих-код, затем" Сохранить ", чтобы сделать эту настройку постоянной. Теперь ваш 3310g находится в режиме эмуляции в режиме ожидания, обратите внимание на новое устройство/dev/ttyACM0 или/dev/ttyUSB0. Прочитайте последовательный порт с простыми файловыми операциями из python:

f = open('/dev/ttyACM0')
print f.read(13)
5
добавлено
Это отлично работает! Единственная проблема - каждый раз, когда я просматриваю новый код, я ТОЛЬКО получаю первые 13 символов. Я знаю, что для этого требуется больше исследований и изучения Python, но возможно ли интерпретировать либо последнюю «строку», либо ТОЛЬКО данные текущего сканирования?
добавлено автор Michael, источник
Нашел это сообщение в блоге, которое отправляет меня в правильном направлении. stealth- x.com/programming/driver-writing-with-pyth‌ on.php Большое спасибо за помощь в этом!
добавлено автор Michael, источник
Ссылка Quick Start Guide мертва
добавлено автор user2682863, источник
f = open ('/ dev/tty') работает для меня.
добавлено автор domih, источник
Вы можете разделить коды на возврат каретки. Используйте краткое руководство для сканирования соответствующего кода с именем «Добавить суффикс CR» в разделе «Суффикс». После этого вы можете читать по циклу на 1 символ, ожидая CR (# 13) в конце каждого штрих-кода.
добавлено автор Pashka, источник

Ошибка, которую вы получаете, из этой строки:

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

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

NO_SCAN_CODE[11]

NO_SCAN_CODE is a dictionary that only contains values for the keys [30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40], not 11.

The fact that you're getting this error means that you've received a usb.core.USBError, and 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)
1
добавлено
Спасибо, пробовал это. Вот результат, я сделал с 20 и смог выполнить некоторые проверки во время его запуска: parallels @ ubuntu: ~/Documents/pyusb $ sudo python scan.py array ('B ', [0, 0, 18, 0, 0, 0, 0, 0]) массив (' B ', [0, 0, 14, 0, 0, 0, 0, 0]) ... 18 больше, чем заканчивается. Я не совсем уверен, что это значит, это в основном тот же результат, что и в первый раз, но я не уверен, как извлечь из этого код из этого? Спасибо!
добавлено автор Michael, источник
Я думаю, что это может быть частью проблемы. Я не знаю, что я должен или хочу получить. Я смотрел этот документ: honeywellaidc.com/ CatalogDocuments/& hellip; Но я не могу определить, как разбирать вывод. Я добавляю полный вывод к вопросу. Спасибо!
добавлено автор Michael, источник
@Michael Знаете ли вы, какие ценности вы ожидаете получить? Не могли бы вы добавить полный вывод на свой вопрос?
добавлено автор Alex L, источник
Python
Python
7 654 участник(ов)

Уютный чат для профессионалов, занимающихся поиском питоньих мудростей. Как не получить бан: https://t.me/ru_python/577926

Python beginners
Python beginners
4 449 участник(ов)

Вопросы про Python для чайников. Cпам и троллинг неприемлем. Не злоупотребляйте стикерами. Частозадаваемые вопросы: https://github.com/ru-python-beginners/faq/blob/master/README.md Статистика тут: https://grstats.me/chat/x4qym2k5uvfkr3al6at7

RU.UBUNTU — сообщество пользователей Ubuntu
RU.UBUNTU — сообщество пользователей Ubuntu
1 681 участник(ов)

Сообщество пользователей Ubuntu Правила: https://telegra.ph/Pravila-soobshchestva-polzovatelej-ru-ubuntu-01-05 Список интересных групп и каналов: https://github.com/goq/telegram-list

pro.python
pro.python
1 090 участник(ов)

Сообщество разработчиков под Python Создатель: @rodgelius

Rude Python
Rude Python
971 участник(ов)

Python без „девочек”, здесь матерятся и унижают Django. Not gay friendly. Правила: t.me/rudepython/114107 @rudepython | t.me/rudepython

rupython
rupython
509 участник(ов)

Группа создана с целью оперативного получения ответов на возникающие вопросы по разработке на яп python, смежные темы, а также человеческого общения. Приветствую!

Python-programming
Python-programming
266 участник(ов)

Чат группы вконтакте https://vk.com/python_community