2014-10-11 3 views
0

업데이트 :데이터가있을 경우에만 USB 바코드 스캐너에서 읽기

나는 파이썬을 사용하여 USB 바코드 스캐너를 성공적으로 읽을 수있었습니다. 사용자가 비어의 경우 EOF 늘 돌아 인수없이 fp.read()를 사용하여 전송하지 않습니다 바코드 스캐너 때문에 왼쪽 LCD 버튼

def read Barcode 
lcd.backlight(lcd.GREEN) 
hid = { 4: 'a', 5: 'b', 6: 'c', 7: 'd', 8: 'e', 9: 'f', 10: 'g', 11: 'h', 12: 'i', 13: 'j', 14: 'k', 15: 'l', 16: 'm', 17: 'n', 18: 'o', 19: 'p', 20: 'q', 21: 'r', 22: 's', 23: 't', 24: 'u', 25: 'v', 26: 'w', 27: 'x', 28: 'y', 29: 'z', 30: '1', 31: '2', 32: '3', 33: '4', 34: '5', 35: '6', 36: '7', 37: '8', 38: '9', 39: '0', 44: ' ', 45: '-', 46: '=', 47: '[', 48: ']', 49: '\\', 51: ';' , 52: '\'', 53: '~', 54: ',', 55: '.', 56: '/' } 
hid2 = { 4: 'A', 5: 'B', 6: 'C', 7: 'D', 8: 'E', 9: 'F', 10: 'G', 11: 'H', 12: 'I', 13: 'J', 14: 'K', 15: 'L', 16: 'M', 17: 'N', 18: 'O', 19: 'P', 20: 'Q', 21: 'R', 22: 'S', 23: 'T', 24: 'U', 25: 'V', 26: 'W', 27: 'X', 28: 'Y', 29: 'Z', 30: '!', 31: '@', 32: '#', 33: '$', 34: '%', 35: '^', 36: '&', 37: '*', 38: '(', 39: ')', 44: ' ', 45: '_', 46: '+', 47: '{', 48: '}', 49: '|', 51: ':' , 52: '"', 53: '~', 54: '<', 55: '>', 56: '?' } 
backPressed = False 
lcd.clear() 
lcd.message("accn: \nLocation: ") 
lcd.setCursor(7, 1) 
print("Scan Next Accn:") 
while not backPressed: 
    fp = open('/dev/hidraw0', 'r') 
    accn = "" 
    shift = False 
    done = False 
    print("should loop") 
    r, w, e = select.select([ fp ], [], [], 0) 
    print("Should be a line here") 
    if fp in r: 
    print("Fp is in r") 
    while not done: 
     print("looping") 
     buffer = os.read(fp.fileno(), 8) 
     for c in buffer: 
      if ord(c) > 0: 
      if int(ord(c)) == 40: 
       done = True 
       fp.flush() 
       fp.close() 
       print("Done = True") 
       break; 
      if shift: 
       if int(ord(c)) == 2 : 
        shift = True 
       else: 
        accn += hid2[ int(ord(c)) ] 
        shift = False 
      else: 
       if int(ord(c)) == 2 : 
        shift = True 
       else: 
        accn += hid[ int(ord(c)) ] 
    print("accn: " + accn) 
    fileAccn(accn) 
    fp.close() 
    backPressed = lcd.buttonPressed(lcd.LEFT) 
    if(backPressed): 
     lcd.backlight(lcd.WHITE) 
     return 
    backPressed = lcd.buttonPressed(lcd.LEFT) 
    if(backPressed): 
    return 
return 

밀어 경우 나는 비어있는 경우 fp.read() 탈출 및 확인 할 수 있도록하려면 . 어떤 도움을 주셔서 감사합니다. 바코드를 스캔하는 중간에 기능을 종료하고 싶지 않기 때문에 인터럽트 나 시간 초과를 사용하는 것을 주저합니다.

미리 감사드립니다.

답변

1

난 그냥 합법적 인 답을 업데이트하고 싶었 :

다음은 그 사용의 예입니다. 나는이 문제가 evdev으로 가장 잘 해결된다고 생각한다. 다음은 내가 함께 자갈을 넣은 기능입니다.

기본적으로 호출 될 때 바코드 스캐너 event = dev.read_one()에서 하나의 이벤트를 읽습니다. 균등하지 않은 경우 이동합니다.

문자를 치면 리턴 키 이벤트가 수신 될 때까지 짝수의 내용을 계속 점검합니다. 이 시점에서 바코드가 끝나면 바코드가 반환됩니다. 루프를 종료하려면 사용자가 뒤로 버튼을 누를 수 있습니다.

메모 몇 개를 입력하면 기능을 시작하기 전에 모든 이벤트를 읽는 것이 좋습니다. 이 함수가 모든 이벤트를 지우지 않았다고 생각하고 함수가 호출되기 전에 이벤트가 발생하면 (즉, 바코드를 스캔 한 경우) 마지막 몇 문자를 잡을 수 있습니다.

#!/usr/bin/env python 

from evdev import * 
import signal, sys, time 

keys = { 
    # 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' 
} 
dev = InputDevice('/dev/input/event0') 
def scanBarcode(): 
    barcode = '' 
    while True: 
     event = dev.read_one() 
     if event is None and barcode == '': 
     #There are blank events in between characters, 
     #so we don't want to break if we've started 
     #reading them 
     break #nothing of importance, start a new read. 
     try: 
     if event is not None: 
      if event.type == ecodes.EV_KEY: 
      data = categorize(event) 
      if data.keystate == 0 and data.scancode != 42: # Catch only keyup, and not Enter 
       if data.scancode == 28: #looking return key to be pressed 
       return barcode 
       else: 
        barcode += keys[data.scancode] # add the new char to the barcode 
     except AttributeError: 
      print "error parsing stream" 
      return 'SOMETHING WENT WRONG' 
     if lcd.buttonPressed(lcd.LEFT): 
     return 
0

어쩌면이 question에 대한 대답이 도움이 될 수 있습니다. os.read()을 일반 바이트 read 대신 지정된 바이트 수와 함께 사용하는 것이 좋습니다. os.read()은 아무 것도 읽지 않은 경우 반환됩니다.

+0

정말 도움이되는 링크입니다. 나는 지금 일하고있다. 바코드를 읽은 후 파일에 데이터가 남아있는 것으로 나타났습니다. 파일을 닫은 다음 다시 열면 내 문제도 해결 된 것 같습니다. – Tom