pharmacy-pos-qr-system/backend/samples/barcode_reader.py
시골약사 b4de6ff791 feat: 통합 테스트 및 샘플 코드 추가
- test_integration.py: QR 토큰 생성 및 라벨 테스트
- samples/barcode_print.py: Brother QL 프린터 예제
- samples/barcode_reader_gui.py: 바코드 리더 GUI 참고 코드

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-23 16:36:41 +09:00

151 lines
4.5 KiB
Python

"""
허니웰 바코드 리더기 COM3 포트 리딩 프로그램
바코드 스캔 시 터미널에 실시간 출력
"""
import serial
import sys
import io
from datetime import datetime
# Windows cp949 인코딩 문제 해결
if sys.platform == 'win32':
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
def read_barcode_from_com3(port='COM3', baudrate=9600, timeout=1):
"""
COM3 포트에서 바코드 데이터를 읽어 터미널에 출력
Args:
port: COM 포트 번호 (기본값: COM3)
baudrate: 통신 속도 (기본값: 9600, 허니웰 기본값)
timeout: 읽기 타임아웃 (초)
"""
print(f'[시작] 바코드 리더기 연결 중...')
print(f'포트: {port}')
print(f'속도: {baudrate} bps')
print('-' * 60)
try:
# 시리얼 포트 열기
ser = serial.Serial(
port=port,
baudrate=baudrate,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
timeout=timeout
)
print(f'[성공] {port} 포트 연결 완료!')
print('[대기] 바코드를 스캔해주세요... (종료: Ctrl+C)')
print('=' * 60)
print()
scan_count = 0
while True:
# 시리얼 포트에서 데이터 읽기
if ser.in_waiting > 0:
# 바코드 데이터 읽기 (개행문자까지)
barcode_data = ser.readline()
# 바이트를 문자열로 디코딩
try:
barcode_str = barcode_data.decode('utf-8').strip()
except UnicodeDecodeError:
# UTF-8 실패 시 ASCII로 시도
barcode_str = barcode_data.decode('ascii', errors='ignore').strip()
if barcode_str:
scan_count += 1
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print(f'[스캔 #{scan_count}] {timestamp}')
print(f'바코드: {barcode_str}')
print(f'길이: {len(barcode_str)}')
print(f'원본(HEX): {barcode_data.hex()}')
print('-' * 60)
except serial.SerialException as e:
print(f'[오류] 포트 연결 실패: {e}')
print()
print('가능한 해결 방법:')
print(' 1. COM3 포트가 다른 프로그램에서 사용 중인지 확인')
print(' 2. 바코드 리더기가 제대로 연결되어 있는지 확인')
print(' 3. 장치 관리자에서 포트 번호 확인 (COM3이 맞는지)')
print(' 4. USB 케이블을 다시 연결해보기')
return 1
except KeyboardInterrupt:
print()
print('=' * 60)
print(f'[종료] 총 {scan_count}개의 바코드를 스캔했습니다.')
print('[완료] 프로그램을 종료합니다.')
ser.close()
return 0
except Exception as e:
print(f'[오류] 예상치 못한 오류 발생: {e}')
return 1
finally:
if 'ser' in locals() and ser.is_open:
ser.close()
print('[정리] 포트 연결 종료')
def list_available_ports():
"""사용 가능한 COM 포트 목록 출력"""
import serial.tools.list_ports
ports = serial.tools.list_ports.comports()
if not ports:
print('[알림] 사용 가능한 COM 포트가 없습니다.')
return
print('[사용 가능한 COM 포트]')
print('-' * 60)
for port in ports:
print(f'포트: {port.device}')
print(f' 설명: {port.description}')
print(f' 제조사: {port.manufacturer}')
print()
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser(
description='허니웰 바코드 리더기 COM 포트 리딩 프로그램'
)
parser.add_argument(
'--port',
default='COM3',
help='COM 포트 번호 (기본값: COM3)'
)
parser.add_argument(
'--baudrate',
type=int,
default=9600,
help='통신 속도 (기본값: 9600)'
)
parser.add_argument(
'--list-ports',
action='store_true',
help='사용 가능한 COM 포트 목록 출력'
)
args = parser.parse_args()
if args.list_ports:
list_available_ports()
else:
exit_code = read_barcode_from_com3(
port=args.port,
baudrate=args.baudrate
)
sys.exit(exit_code)