프린터 상태 체크 및 오류 처리
프린터 상태를 실시간으로 확인하려면 상태 체크 명령어를 사용해야 함.
프린터가 용지가 없는지, 용지 걸림이 발생했는지, 컷터 오류가 있는지 등의 상태를 확인할 수 있음.
- 실시간 상태 확인:
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임을 나타내며, 다음과 같은 상태- 용지 있음
- 프린터 헤드 다운
- 용지 잼 없음
- 용지 잔량 많음
- 프린트 완료
- 컷터 에러 없음
- 보조센서에 용지 없음