如何向 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 或类似名称的驱动程序(在我的例子中):
- 安装它并使用 GUI 配置打印机连接。
- 利用Java方法
如果没有:
- 在控制面板中共享打印机。
- 以管理员身份打开cmd
- NET USE LPT1 \[Computer-Name]\Printer
/Persistent:Yes (win8.1 无效)
来自 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;
}
我的 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 或类似名称的驱动程序(在我的例子中):
- 安装它并使用 GUI 配置打印机连接。
- 利用Java方法
如果没有:
- 在控制面板中共享打印机。
- 以管理员身份打开cmd
- NET USE LPT1 \[Computer-Name]\Printer /Persistent:Yes (win8.1 无效)
来自 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; }