【问题标题】:How to print from the Thermal Printer in Android?如何从 Android 中的热敏打印机打印?
【发布时间】:2013-03-20 01:11:19
【问题描述】:

我正在为具有内置行式打印机的 Android 设备开发一个应用程序。我必须与这台打印机交互并使用它来打印收据上的详细信息,然后用裁纸器自动切割该收据。我在其中看到了一些 ESC 命令,但我不知道如何执行这些 ESC 命令。

我有关于卡西欧设备打印机的三个主要问题:

1.我使用了内置打印机的打印代码,但是打印后切刀没有激活

BuildinEx840 ex840 = new BuildinEx840();
int response = ex840.open();
System.out.println("ex840 open:" + response);

byte[] set = {
    'N', 'A', 'R', 'E', 'S', 'H', 'S', 'H', 'A', 'R', 'M', 'A', (byte) 0x0d, (byte) 0x0a
};

try {        

    ex840.write(set);   

} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

try {

    response = ex840.getEndStatus();
    System.out.println("getEndStatus:" + response);
    response = ex840.initCutter();
    ex840.close();    
    System.out.println("initCutter:" + response);

} catch (Exception e) {         
    e.printStackTrace();         
}

2。我不知道如何在 android 中向打印机发送 ESC 命令

下面有很多命令

ESC FF DataPrint,
[code]  <1B>H<OC>H,
[Function] Print all the data in the print area collectively.

我们如何通过编程在android中执行这些ESC命令??

3.我不知道如何按要求的格式打印收据

有一些 ESC 命令可用于提供左右边距和一些其他命令。那么如何以某种格式打印数据,并可以更改文本的大小以及要打印的文本的其他一些设置。

感谢任何帮助。

【问题讨论】:

  • 发送 ESC/POS 命令的常规方法是使用 ex840.write 方法,您只需将它们作为章程发送,因此在您的 ESC FF 示例中,您将发送 (char)27 + (char)12 后跟要打印的文本(27 = 1B 十六进制,因此 [code] 部分告诉您发送 H,其中 H 表示十六进制)。所以你的集合会变成byte[] set={(char)27, (char)12, 'N','A' ... 然后你可以把这些命令堆叠起来,例如ESC FF ESC nn Your Data 获取您需要的格式。免责声明:我没有使用这款 Casio 打印机或 Android 的 ESC/POS,但这就是它在我使用过的所有其他语言/打印机中的工作方式。
  • 对于 3.:嗯,您必须深入挖掘您的需求/要求,并通过 ESC 命令文档找到适合所需/所需格式的转义序列。这些必须合并到要打印的文本中,以便生成的打印输出包含按要求格式化的文本。
  • 对于 1. 在切割器未切割后查看响应包含的内容会很有用。另外,我有 99% 的把握可以发送一个转义序列来剪纸。我会试试的。如果切割机发出“失败”的信号,你会怎么做?您只能发送命令“cut!”,您可能可以使用转义序列来执行此操作。
  • @TheBlastOne 感谢您的回复。当我使用上面的代码时,它只是在收据上打印文本,但切刀不工作。 ESC 命令也可用,但我不知道如何应用它们。有枚举类型,我不知道如何应用于剪纸类型的方法。
  • 我觉得奇怪的是你调用了 initCutter 但没有进行剪切的方法。 (可能是initCutter不切而是init,需要调用不同的方法来切。)

标签: java android escaping point-of-sale thermal-printer


【解决方案1】:

在过去 7 天工作后,我找到了打印的正确方法,然后用裁纸器裁切了收据。 ESC 命令对于获取与打印机相关的打印和其他任务非常重要。我们必须将这些 ESC CMD 以字节数组的形式传递给行式打印机。

有很多类似下面的命令

ESC FF DataPrint,
[code]  <1B>H<OC>H,
[Function] Print all the data in the print area collectively.

所以只需简单地创建此命令的字节数组并将其传递给打印机。

e.g. byte[] print = {0x1b,0x0c};

现在将其传递给打印机。必须有一些方法,如 getCmd() 或 writeCmd() 等,具体取决于打印机。

我们如何通过编程在android中执行这些ESC命令? 以下是执行此操作的代码

    BuildinEx840 lpd=new BuildinEx840();
            lpd.setMulticharMode(LinePrinterDeviceBase.CHARACTERSET_USA);
//initialise Cutter
            lpd.initCutter();
            LinePrinter lp=new LinePrinter();
            lp.open(lpd);
            lpd.open();
            try{
                lpd.init();
            }catch(IOException e){
                e.printStackTrace();
            }
            for(int i=0; i<5;i++){
                lp.printNormal("Testing the Line Printer");
            }
            int totalLinefeed=listofItemList.size();
//ESC CMD for line feeds
            byte[] lfs=new byte[]{0x1B,'d', 5};
            sendtoExprinter(lpd,lfs);
//ESC CMD for paper cut
            lfs=new byte[]{0x1B,'i'};
            sendtoExprinter(lpd, lfs);

private void sendtoExprinter(BuildinEx840 dev, byte[] instr) {
        try{
            dev.write(instr);
        }catch(IOException e){
            e.printStackTrace();
        }

    }

更新: 通过热敏打印机打印图像

在某些打印机中,您可以在打印机的非易失性内存中定义图像,然后通过 ESC cmd 1C 70 01 30 从那里打印图像。在其他一些打印机中,您可以在通过热敏打印机打印图像时提供图像的直接路径。

在任何行式打印机中,我们必须通过 printerObj.write(command); 方式传递 ESC CMD。我要感谢 SO 社区,特别感谢 TheBlastOne 引导我走上正确的道路。

如果有人在集成热敏打印机方面遇到任何问题,请随时提出。

【讨论】:

  • @TheBlastOne 我要感谢你指导我。我也有你的一个问题。如何将这些文本以格式放置在收据上,例如从左右给定适当的边距等。
  • 宽泛的问题...如果您使用的是固定间距(非比例)字体,请创建一个“X”字符的网格打印输出,使其为全宽且在纸。由此得出要打印的位置。然后,使用正确的内容(ESC 序列和文本/数据)创建 .write 语句。这是仅由 CRLF 和空白定位的“直接方法”,即语句顺序 = 打印顺序(和放置)。另一种方法是打印到内存中的“画布”缓冲区,并在完成后将其打印出来。 (您可能想为此打开一个单独的问题。)
  • @TheBlastOne 就像我们发送换行命令和更可爱的命令一样,我认为我们可以传递格式化命令。请提出一些建议
  • @NareshSharma - 你是如何将你的安卓设备连接到你的打印机的?你是通过 USB 还是串口(使用 RS232-USB 转换器)?
  • @Sandeep 我通过 USB、蓝牙和 wifi 连接。如何使用打印机以及打印机提供的支持取决于您自己。
猜你喜欢
  • 2012-10-05
  • 2016-05-05
  • 2019-08-27
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
相关资源
最近更新 更多