首页 文章

PyUsb USB条码扫描器

提问于
浏览
6

我正在尝试使用Ubuntu中的Honeywell USB 3310g扫描仪从条形码或qrcode输出字符串 . 我有一个libusb和一个名为metro-usb(http://gitorious.org/other/metro-usb)的库,可以使我的扫描仪工作 . 如果我打开gedit并扫描,我成功地获得了qrcode数据!我需要能够以实用的方式构建它并将数据发送到Web服务 .

我已经下载并且实际上是pyusb,这似乎是我研究中最好的解决方案 . 我有一个脚本基于我在网上找到的等待扫描的东西,并成功地给我一个扫描结果 . 但是,我不确定如何阅读数据 . 我得到了一组没有任何意义的数据 . 我也不熟悉USB编程或Python . 任何人都可以指导我从USB条形码扫描中获取数据串的最佳方法吗?我最有可能找出其余部分 . 此外,我收到一个错误,我总是要注释,以便在我尝试set_configuration时运行该程序 . 我总是得到一个错误,说资源很繁忙...不确定这是否与它有任何关系..我已经从网上获得了这个脚本,以及我的lsusb命令中的产品ID和供应商ID . 当我通过注释掉的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])

2 回答

  • 1

    抓取Quick Start Guide,扫描"USB Serial" -mode条形码,然后"Save"条形码以使此设置成为永久性 . 现在您的3310g处于serail仿真模式,请注意新的/ dev / ttyACM0或/ dev / ttyUSB0设备 . 使用python中的简单文件操作读取串口:

    f = open('/dev/ttyACM0')
    print f.read(13)
    
  • 6

    您收到的错误来自以下行:

    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 的值的字典 .

    你're getting this error means that you'收到 usb.core.USBErrorlen(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)
    

相关问题