树莓派利用multiprocessing 同时开启两个进程对条形码进行读取

from multiprocessing import Process
import os
import time
import serial
import time
from evdev import InputDevice, ecodes, list_devices, categorize
import signal, sys


scancodes = {
    # Scancode: ASCIICode
    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', 100: u'RALT',57:u" "
}

scancodes_leftshift = {
    # Scancode: ASCIICode
    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', 100: u'RALT',57:u" "
}


ser = serial.Serial("/dev/ttyAMA0", 115200)
barCodeDeviceString = "Newland Auto-ID NLS IOTC PRDs HID KBW"
dev1 = None #设备
dev2 = None


def worker1(name):
    print(name + "\n")
    global dev1
    i = 0
    devices = map(InputDevice, list_devices())
    for device in devices:
        if device.name == barCodeDeviceString:
            i = i + 1
            if i == 1:
                dev1 = InputDevice(device.fn)

    if not dev1:
        print("not found dev1")
        return

    def signal_handler(signalnum, frame):
        print(signalnum)
        print(frame)
        print("Stopping")
        dev1.ungrab()
        sys.exit(0)

    #signal.signal(signal.SIGINT, signal_handler)
    signal.signal(signal.SIGTERM, signal_handler)

    dev1.grab()
    barcode = ""
    keymap = scancodes
    for event in dev1.read_loop():
        if event.type == ecodes.EV_KEY:
            data = categorize(event)
            if data.scancode == 42:
                if data.keystate == 1:
                    keymap = scancodes_leftshift
                if data.keystate == 0:
                    keymap = scancodes_leftshift

            #只接收输入,不接收输出,也不接收回车
            if data.keystate == 1 and data.scancode != 42:
                if data.scancode == 28:
                    print("s1: " + barcode)
                    barcode = ""
                    break
                else:
                    if data.scancode >= 1 and data.scancode <= 57:
                        barcode += keymap[data.scancode]

def worker2(name):
    print(name + "\n")
    global dev2
    i = 0
    devices = map(InputDevice, list_devices())
    for device in devices:
        if device.name == barCodeDeviceString:
            i = i + 1
            if i == 2:
                dev2 = InputDevice(device.fn)
    if not dev2:
        print("not found dev2")
        return

    def signal_handler(signalnum, frame):
        print(signalnum)
        print(frame)
        print("Stopping")
        dev2.ungrab()
        sys.exit(0)

    #signal.signal(signal.SIGINT, signal_handler)
    signal.signal(signal.SIGTERM, signal_handler)

    dev2.grab()
    barcode = ""
    keymap = scancodes
    for event in dev2.read_loop():
        if event.type == ecodes.EV_KEY:
            data = categorize(event)
            if data.scancode == 42:
                if data.keystate == 1:
                    keymap = scancodes_leftshift
                if data.keystate == 0:
                    keymap = scancodes_leftshift

            #只接收输入,不接收输出,也不接收回车
            if data.keystate == 1 and data.scancode != 42:
                if data.scancode == 28:
                    print("s2: " + barcode)
                    barcode = ""
                    break
                else:
                    if data.scancode >= 1 and data.scancode <= 57:
                        barcode += keymap[data.scancode]


if __name__ == '__main__':
    # 检测到用户扫码,发送SystemStart_Sigal以启动系统
    ser.write('_SystemStart_Sigal\n'.encode())

    p1 = Process(target=worker1, args=("worker1",))
    p1.start()
    p2 = Process(target=worker2, args=("worker2",))
    p2.start()
    t1 = time.time()

    while(1):
        if not p1.is_alive():
            p2.terminate()
            break
        if not p2.is_alive():
            p1.terminate()
            break
        if int(time.time()) - t1 > 5:
            print("process killed\n")
            p1.terminate()
            p2.terminate()
            print("terminated")

            # 检测到用户扫码,发送SystemStart_Sigal以启动单片机系统
            ser.write('NotExist_Substance'.encode())

            break

    print("end")
发布了297 篇原创文章 · 获赞 85 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/weixin_40973138/article/details/102536731
今日推荐