是否可以使用ESC命令获取热敏打印机的状态?

时间:2019-05-14 11:58:25

标签: java printing thermal-printer epson escpos

我正在向库escpos-coffee中添加一个方法,该方法将返回热敏打印机的状态,即它是联机/脱机状态,纸张用完还是纸张用完,或现金抽屉是否打开/关闭。

我在escpos-coffee库中添加了一种方法“ showPrinterStatus”,该方法基于ESC c 3命令,该命令以字节形式将命令发送给打印机。据推测,该方法可启用卷纸即将用尽传感器以及卷纸即将用尽传感器。此外,我基于GS r命令添加了另一种方法“ transmitStatus”,该方法发送n = 1和n = 49的纸张传感器状态,以及n = 2和n = 2的现金抽屉状态。 50这是代码:

 /**
     *
     * @param nSignal
     * @return
     * @throws IOException
     * Method decides whether the printer should return an output paper-end signal to a parallel interface or not
     * input 1,2 4,8 to enable, 0 to disable
     */

    public EscPos showPrinterStatus(int nSignal)  throws IOException {
        write(27);
        write('c');
        write('3');
        write(nSignal);
        return this;
    }

    /**
     *
     * @param n
     * @return
     * @throws IOException
     * returns the status of the printer, 1 or 49 returns paper sensor status, 2 or 50 returns drawer kick-out connector status
     */
    public EscPos transmitStatus(int n) throws IOException{
      write(29);
      write('r');
      return this;
    }

我正在使用Device Monitoring Studio,并期望会有一些可见的通信。看起来showPrinterStatus方法正在向热敏打印机发送信号,但是sendStatus方法似乎根本不会引起任何通信。另外,如果我检查现金抽屉的状态并保持现金抽屉未打开,则根本没有任何通信,并且仅将请求排队。当我将现金抽屉推回后,打印机执行命令需要5到10分钟的时间,该命令一直在队列中。

在实现过程中是否有我遗忘的东西,或者有比Device Monitoring Studio更好的方法来显示打印机状态?

2 个答案:

答案 0 :(得分:1)

我有同样的问题,但是我通过USB连接,尝试使用串行端口,然后从中读取。我不是Java开发人员,但这是我在python中的解决方案

from serial import Serial
serial = Serial('/dev/ttyUSB0', 115200, timeout=.03)
serial.write(b'\x10\x04\x01')
serial.read()

另一种方法是通过终端(如果您使用的是Linux)

echo -n '\x10\x04\x01' > /dev/usb/lp0 #assuming lp0 is your printer 

cat /dev/usb/lp0 

它将数据输出到缓冲区中,而不将其打印在纸上

答案 1 :(得分:1)

如果您使用的是USB接口,则可以尝试使用usb4java lib,然后可以从打印机读取字节,对我来说,它可以在linux上运行,并在门打开或纸张用完时显示...,但我还没有在Windows上对其进行测试...

    UsbEndpoint endpointIn = iface.getUsbEndpoint(endpointAddressIn);
    UsbPipe pipeIn = endpointIn.getUsbPipe();
    pipeIn.open();
    byte[] data = new byte[1024];
    int received;
    received = pipeIn.syncSubmit(data);
    pipeIn.close();

完整代码在github上:Usb Printer Status