Java 如何在Android中使用热敏打印机进行打印?

Java 如何在Android中使用热敏打印机进行打印?,java,android,escaping,point-of-sale,thermal-printer,Java,Android,Escaping,Point Of Sale,Thermal Printer,我正在为Android设备开发一个应用程序,该设备将具有内置打印机。我必须与这台打印机交互,并使用它打印收据上的详细信息,然后使用切割机自动切割收据。我在其中看到了一些ESC命令,但我不知道如何执行这些ESC命令 关于卡西欧设备打印机,我有三个主要问题: 1.我已使用内置打印机的打印代码,但打印后,切割器未激活 BuildinEx840 ex840 = new BuildinEx840(); int response = ex840.open(); System.out.println("ex8

我正在为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命令

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();         
}
有许多命令如下所示

ESC FF DataPrint,
[code]  <1B>H<OC>H,
[Function] Print all the data in the print area collectively.
ESC FF数据打印,
[代码]HH,
[功能]集中打印打印区域中的所有数据。
我们如何通过编程在android中执行这些ESC命令

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

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


感谢您的帮助

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

有许多命令如下所示

ESC FF DataPrint,
[code]  <1B>H<OC>H,
[Function] Print all the data in the print area collectively.
现在把它交给打印机。根据打印机的不同,必须有一些方法,如getCmd()或writeCmd()等

e.g. byte[] print = {0x1b,0x0c};
我们如何通过编程在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();
        }

    }
BuildinEx840 lpd=newbuildinex840();
lpd.setMulticharMode(LinePrinterDeviceBase.CHARACTERSET_USA);
//初始化切割器
lpd.initCutter();
LinePrinter lp=新的LinePrinter();
低压断路器(lpd);
lpd.open();
试一试{
lpd.init();
}捕获(IOE异常){
e、 printStackTrace();
}

对于(int i=0;发送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您的数据
以获得您所需的格式。免责声明:我没有使用安卓系统的这款卡西欧打印机或ESC/POS,但我使用过的每种其他语言/打印机都是这样工作的。第3点:您必须深入了解您的需要/要求,并且粗略阅读ESC命令文档,找到符合所需/所需格式的转义序列。这些转义序列必须合并到要打印的文本中,以便生成的打印输出包含所需格式的文本。对于1,查看切割器未剪切后包含的响应将非常有用。此外,我99%确定存在esca你可以发送pe序列来剪切纸张。我会试试。如果切纸机发出“失败”信号,你会怎么做?你只能发送“剪切”命令,您可能可以使用转义序列来执行此操作。@Theblatone感谢您的响应。当我使用上述代码时,它只打印收据上的文本,但切纸机不起作用。还有ESC命令,但我不知道如何应用它们。有一种类型是enum,我不知道如何在剪纸类型的方法上应用。我发现它是strange您调用initcuter,但没有执行剪切的方法。(可能是initCutter不执行剪切,而是init,您需要调用其他方法来执行剪切。)@TheBlastOne我想感谢您的指导。我还有一个问题需要您解答。如何将这些文本以类似于“从左到右留出适当的边距”之类的格式放置在收据上。这是一个悬而未决的问题……如果您使用的是固定间距(非比例)字体,请创建“X”的网格打印输出字符,使其在纸张上具有全宽和有用的高度。由此导出要打印的位置。然后,创建具有正确内容(ESC序列和文本/数据)的语句。这是“直接方法”,仅通过CRLF和空格进行定位,即语句顺序=打印序列(和位置)。另一种方法是打印到内存中的“canvas”缓冲区,并在完成后将其打印出来。(您可能需要为此打开一个seaparate问题。)@就像我们用同样的方式发送换行器和剪切器的命令一样,我认为我们可以传递格式化命令。请建议something@NareshSharma-您如何将android设备连接到打印机?您使用的是USB还是串行(使用RS232-USB转换器)?@Sandeep我通过USB、蓝牙和wifi连接。如何使用打印机以及打印机提供的支持取决于您。