영수증 프린터 상태 및 오류처리

Category
모듈 분석
Status
Published
Tags
Kiosk
Module
Description
Published
Slug

프린터 상태 체크 및 오류 처리

프린터 상태를 실시간으로 확인하려면 상태 체크 명령어를 사용해야 함.
프린터가 용지가 없는지, 용지 걸림이 발생했는지, 컷터 오류가 있는지 등의 상태를 확인할 수 있음.
  • 실시간 상태 확인: DLE EOT n 명령어를 사용하여 프린터의 현재 상태를 요청
  • 자동 응답 설정: GS a n 명령어를 사용하여 프린터 상태가 변경될 때 자동으로 응답하도록 설정
예시
const statusCommand = new Uint8Array([0x10, 0x04, 0x01]); // DLE EOT 1 await device.transferOut(2, statusCommand); // 2는 전송할 인터페이스 번호
상태 체크 명령어 DLE EOT n
  • DLE (Data Link Escape)는 프린터와의 통신에서 명령어의 시작을 나타내는 이스케이프 문자
  • EOT (End of Transmission)는 전송 종료를 나타내는 문자
  • n은 요청하는 상태의 종류를 나타내는 매개변수
 

자동 응답 설정

자동 응답 명령어: GS a n GS (Group Separator)는 상태 변경 시 프린터가 자동으로 응답하도록 설정하는 명령어.n은 자동 응답을 활성화할 조건을 설정함. 예를 들어, 프린터의 상태가 변경될 때마다 응답하도록 설정할 수 있음.
  • 자동 응답 명령어: GS a n
  • GS (Group Separator)는 상태 변경 시 프린터가 자동으로 응답하도록 설정하는 명령어.
  • n은 자동 응답을 활성화할 조건을 설정함. 예를 들어, 프린터의 상태가 변경될 때마다 응답하도록 설정할 수 있음
 

GS a n 명령어

  • 코드: 1D 61 n
  • n의 값:
    • 0: 상태 체크 자동 응답 기능을 해제.
    • 1: 상태 체크 자동 응답 기능을 설정.
활용 예시

예시 1: 자동 응답 기능 활성화

프린터가 용지 부족, 용지 걸림, 커버 열림 등의 상태가 발생할 때 자동으로 응답을 받을 수 있도록 설정
async function enableAutoStatusResponse() { try { const port = await navigator.serial.requestPort(); await port.open({ baudRate: 19200 }); const writer = port.writable.getWriter(); // GS a 1 명령어: 프린터 자동 응답 설정 const enableCommand = new Uint8Array([0x1D, 0x61, 0x01]); await writer.write(enableCommand); console.log("프린터 상태 자동 응답 활성화됨"); writer.releaseLock(); } catch (error) { console.error("프린터 설정 실패:", error); } }
 

예시 2: 자동 응답 기능 해제

프린터가 상태 변경에 대해 더 이상 자동 응답을 하지 않도록 설정
async function disableAutoStatusResponse() { try { const port = await navigator.serial.requestPort(); await port.open({ baudRate: 19200 }); const writer = port.writable.getWriter(); // GS a 0 명령어: 프린터 자동 응답 해제 const disableCommand = new Uint8Array([0x1D, 0x61, 0x00]); await writer.write(disableCommand); console.log("프린터 상태 자동 응답 비활성화됨"); writer.releaseLock(); } catch (error) { console.error("프린터 설정 실패:", error); } }
 

자동 응답 활용

자동 응답 기능이 활성화되면, 프린터는 상태가 변경될 때마다 자동으로 상태 정보를 송신하게 됨. 이를 통해 프론트엔드에서 상태 변화를 실시간으로 감지하고, 용지 부족이나 오류가 발생할 때 사용자에게 알림을 줄 수 있음.
 
자동 응답 처리 예시:
async function readPrinterResponse() { try { const port = await navigator.serial.requestPort(); // 사용자가 연결할 직렬 포트를 선택하도록 요청 await port.open({ baudRate: 19200 }); // 선택한 포트를 열고, 통신 속도를 19200 baud로 설정 const reader = port.readable.getReader(); // 열린 포트에서 읽기 가능한 스트림을 가져와서 reader라는 객체를 생성 // 무한 루프를 시작하여 프린터의 응답을 지속적으로 읽음 // value: 읽은 데이터 값 (Uint8Array 형식) // done: 스트림이 종료되었는지를 나타내는 불리언 값 while (true) { const { value, done } = await reader.read(); // done이 true인 경우, 데이터 스트림이 종료되었음을 의미 if (done) { console.log("리더 종료"); break; } // 프린터 응답 처리 console.log("프린터 응답:", value); } // 데이터 읽기가 완료된 후, 리더의 잠금을 해제 (다른 작업에서 이 리더를 사용할 수 있도록) reader.releaseLock(); } catch (error) { console.error("프린터 응답 처리 오류:", error); } }
 
 
수신받은 코드가 0x00이면
  • 비트 0: 용지 있음 (0)
  • 비트 1: 프린터 헤드 다운 (0)
  • 비트 2: 용지 잼 없음 (0)
  • 비트 3: 용지 잔량 많음 (0)
  • 비트 4: 프린트 완료 (0)
  • 비트 5: 컷터 에러 없음 (0)
  • 비트 6: 미사용 (0)
  • 비트 7: 보조센서에 용지 없음 (0)
 
응답받은Uint8Array [0]에서 0은 8비트의 상태 비트
비트
설명
상태
Hex
Hex
Decimal
0
용지 없음
1
01h
0x01
1
1
프린터 헤드 업
1
02h
0x02
2
2
용지 잼 있음
1
04h
0x04
4
3
용지 Near End
1
08h
0x08
8
4
프린트 또는 feeding중
1
10h
0x10
16
5
컷터 에러(잼) 있음
1
20h
0x20
32
6
미사용
0
00h
0x00
0
7
보조센서에 용지 있음
1
80h
0x80
128
여기서 0은 모든 상태 비트가 0임을 나타내며, 다음과 같은 상태
  • 용지 있음
  • 프린터 헤드 다운
  • 용지 잼 없음
  • 용지 잔량 많음
  • 프린트 완료
  • 컷터 에러 없음
  • 보조센서에 용지 없음