平时用的最多的扫描枪通常只是一个简单的输入设备(好比键盘,鼠标), 另一头需要连接电脑, 用的 usb 或者串口. 扫描枪负责识别条码, 电脑收到后执行业务的逻辑. 有时候只是简单的数据采集工作, 数据传到服务器云端;
用到的设备
带 USB 接收器的无线扫码请条码扫描枪(本案例以新大陆OY26-RF无线扫描枪为例)
树莓派 4b
我们将用到 python-evdev 程序库, 封装了对 usb 设备的读写操作. 官网 https://python-evdev.readthedocs.io/
安装 evdev
sudo pip install evdev
检测设备
将扫码枪的无线接收器插入树莓派的USB口,在树莓派上新建python文件,拷贝下方代码并执行,检测设备能否发现
#!/usr/bin/python3
import evdev
# 列出 usb 设备
devices = [evdev.InputDevice(path) for path in evdev.list_devices()]
print('发现设备: ')
for device in devices:
print(device.path, device.name, device.phys)
执行结果如下表示发现设备:
/dev/input/event0 Netum. HIDKB usb-0000:01:00.0-1.3/input0
修改扫码枪配置,增加结束符后缀
扫码枪接入设备后,默认是以键盘的方式接入,读取二维码时,是以一个字符一个字符的方式逐个读取的,默认扫码不增加结束符后缀,程序无法确认是否扫码结束,需要增加结束符来区分
使用扫码枪,扫瞄下方的条码(一次不行的话可以扫描多次),增加TAB结束符;
根据查找到的扫码枪设备信息,调用扫码
import evdev
import time
import findScanGun
from evdev import InputDevice, categorize, ecodes
class ScanGun:
dev = findScanGun.find()
device = InputDevice(dev) # my keyboard
scancodes = {
0: None, 1: u'ESC', 2: u'1', 3: u'2', 4: u'3', 5: u'4', 6: u'5', 7: u'6', 8: u'7', 9: u'8',
10: u'9', 11: u'0', 12: u'-', 13: u'=', 14: u'BKSP', 15: u'TAB', 16: u'q', 17: u'w', 18: u'e', 19: u'r',
20: u't', 21: u'y', 22: u'u', 23: u'i', 24: u'o', 25: u'p', 26: u'[', 27: u']', 28: u'CRLF', 29: u'LCTRL',
30: u'a', 31: u's', 32: u'd', 33: u'f', 34: u'g', 35: u'h', 36: u'j', 37: u'k', 38: u'l', 39: u':',
40: u'"', 41: u'`', 42: u'LSHFT', 43: u'\\', 44: u'z', 45: u'x', 46: u'c', 47: u'v', 48: u'b', 49: u'n',
50: u'm', 51: u',', 52: u'.', 53: u'/', 54: u'RSHFT', 56: u'LALT', 57: u' ', 100: u'RALT'
}
capscodes = {
0: None, 1: u'ESC', 2: u'!', 3: u'@', 4: u'#', 5: u'$', 6: u'%', 7: u'^', 8: u'&', 9: u'*',
10: u'(', 11: u')', 12: u'_', 13: u'+', 14: u'BKSP', 15: u'TAB', 16: u'Q', 17: u'W', 18: u'E', 19: u'R',
20: u'T', 21: u'Y', 22: u'U', 23: u'I', 24: u'O', 25: u'P', 26: u'{', 27: u'}', 28: u'CRLF', 29: u'LCTRL',
30: u'A', 31: u'S', 32: u'D', 33: u'F', 34: u'G', 35: u'H', 36: u'J', 37: u'K', 38: u'L', 39: u':',
40: u'\'', 41: u'~', 42: u'LSHFT', 43: u'|', 44: u'Z', 45: u'X', 46: u'C', 47: u'V', 48: u'B', 49: u'N',
50: u'M', 51: u'<', 52: u'>', 53: u'?', 54: u'RSHFT', 56: u'LALT', 57: u' ', 100: u'RALT'
}
#是否大小写,默认小写
caps = False
#setup vars
x = ''
# grab 是为了独占,保证此设备不会被别的进程捕获
device.grab()
def run(self):
start = time.time()
for event in self.device.read_loop():
if event.type == ecodes.EV_KEY:
data = categorize(event) # Save the event temporarily to introspect it
# 判断按键是不是SHIFT,如果是SHIFT按住的,需要大写锁定,如果事件是松开的那就解除大写锁定
if data.scancode == 42:
if data.keystate == 1:
caps = True
if data.keystate == 0:
caps = False
if data.keystate == 1:
# 判断SHIFT键是不是按住的,如果是按住的就读取大写字母
if self.caps:
key_lookup =self.capscodes.get(data.scancode)
else:
key_lookup = self.scancodes.get(data.scancode)
# SHFT,CTRL,TAB属于特殊按键,不计算在扫码内容结果中
if (data.scancode != 42) and (data.scancode != 28) and (data.scancode != 15):
self.x += key_lookup
if(data.scancode == 15):
print("识别结束:",time.time()-start)
# 解除设备独占,关闭设备
self.device.ungrab()
self.device.close() # Print it all out!
return self.x;
scangun = ScanGun()
list= scangun.run()
print(list)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。