如何向 USB 打印机发送 ESC/POS 命令?

How to send ESC/POS commands to an usb printer?

我的 objective 正在以编程方式打开现金抽屉,但我没有找到有关 Java 如何与 Windows 端口交互的详细信息,所以我无法让它工作。这些是我尝试过的方法(Java 控制台没有错误):

public void cashdrawerOpen()   {

    String code1 = "27 112 0 150 250"; //decimal
    String code2 = "1B 70 00 96 FA"; //hexadecimal
    String code = "ESCp0û."; //ascii

     PrintService service = PrintServiceLookup.lookupDefaultPrintService();
     System.out.println(service.getName());
     DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
    DocPrintJob pj = service.createPrintJob();
     byte[] bytes;
     bytes=code2.getBytes();
     Doc doc=new SimpleDoc(bytes,flavor,null);
      try {
        pj.print(doc, null);
    } catch (PrintException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}


public void cashdrawerOpen2(){
    String code1 = "27 112 0 150 250";
    String code2 = "1B 70 00 96 FA";
    String code = "ESCp0û.";
    FileOutputStream os = null;
    try {
        os = new FileOutputStream("USB001:POS-58");
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
      PrintStream ps = new PrintStream(os);
      ps.print(code1.getBytes());
      ps.close();
}

然后我开始玩 cmd,特别是跟随 this 线程,但是当我执行命令 'copy /b open.bat USB001' 时,它只是说:'overwrite USB001 ? (yes/no/all)'

有什么想法吗?

嗯...USB001 文件必须已经存在于您要复制到的位置,现在它会询问您是否要覆盖它,因为您正在将 open.bat 复制到同一个 USB001 文件名字.

如果您总是想覆盖 USB001 文件,那么也可以使用 /Y 开关,例如:

copy /B /Y open.bat USB001

您可以在命令提示符下输入以下命令查看 COPY 的所有开关:

copy /?

已解决。

我没有找到如何通过 USB 发送命令,我不得不模拟 LPT 端口。

如果您的打印机带有名为 TM Virtual Port Driver 或类似名称的驱动程序(在我的例子中):

  1. 安装它并使用 GUI 配置打印机连接。
  2. 利用Java方法

如果没有:

  1. 在控制面板中共享打印机。
  2. 以管理员身份打开cmd
  3. NET USE LPT1 \[Computer-Name]\Printer /Persistent:Yes (win8.1 无效)
  4. 来自 Java:

    public void cashdrawerOpen(){ 
        String code2 = "1B700096FA"; // my code in hex
        FileOutputStream os = null;
        try {
            os = new FileOutputStream("LPT1:POS-58");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
          PrintStream ps = new PrintStream(os);
        ps.print(toAscii(code2));
          ps.close();
    }
    
    public StringBuilder toAscii( String hex ){
    StringBuilder output = new StringBuilder();
    for (int i = 0; i < hex.length(); i+=2) {
    String str = hex.substring(i, i+2);
    output.append((char)Integer.parseInt(str, 16));
    }
     return output;
    
    }