You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何发送ESC/POS脉冲指令打开Star TSP100连接的钱箱

问题排查与解决方案

针对Star TSP100打印机通过Java打印服务发送钱箱指令无效的问题,核心原因大概率是打印服务的文档类型(DocFlavor)未设置为RAW模式,导致驱动对ESC/POS指令做了解析或过滤,而非直接传递原始字节流。以下是具体排查和修复步骤:

1. 更换DocFlavor为RAW类型

你当前使用的DocFlavor.INPUT_STREAM.AUTOSENSE会让驱动自动检测文档格式,可能将字节流识别为文本并修改内容,从而丢失钱箱指令。需要替换为RAW字节流类型:

修改代码中的Doc初始化部分:

// 直接使用字节数组创建Doc,避免流解析问题
byte[] printData = outputStream.toByteArray();
Doc doc = new SimpleDoc(printData, DocFlavor.BYTE_ARRAY.PRINTABLE, null);

或者使用明确的RAW MIME类型:

DocFlavor rawFlavor = new DocFlavor.INPUT_STREAM("application/octet-stream", null);
Doc doc = new SimpleDoc(inputStream, rawFlavor, null);

2. 调整指令顺序(可选)

部分打印机在切纸指令后需要完成当前打印任务,才能响应钱箱指令。可以尝试将钱箱指令移至切纸之前,或在切纸后添加换行指令:

// 调整后的指令顺序示例
outputStream.write(new byte[]{0x1b,0x45,0x01}); // 粗体
outputStream.write("Hello".getBytes());
outputStream.write(new byte[]{0x0A}); // 换行
outputStream.write(new byte[]{0x1B, 0x70, 0x00, (byte) 0xFF, (byte) 0xFF}); // 打开钱箱
outputStream.write(new byte[]{0x1B, 0x64, 0x02}); // 切纸

3. 尝试Star打印机专用指令(可选)

部分Star TSP100型号可能需要使用厂商专用的钱箱指令,而非通用ESC/POS指令。尝试使用GS p指令替代ESC p:

// Star专用钱箱指令(引脚2)
outputStream.write(new byte[]{0x1D, 0x70, 0x00, (byte) 0xFF, (byte) 0xFF});

4. 检查打印请求属性

确保打印请求属性未启用任何格式转换,比如禁用自动分页或文本格式化:

HashPrintRequestAttributeSet attributes = new HashPrintRequestAttributeSet();
// 添加RAW打印模式属性(部分驱动需要)
attributes.add(new PrinterIsAcceptingJobs(PrinterStateReason.ACCEPTING_JOBS));
finalPrintJob.print(doc, attributes);

核心原因总结

驱动工具能正常打开钱箱,说明硬件和指令本身是有效的。问题出在Java打印服务默认的文档解析逻辑,将ESC/POS字节流当成文本处理,导致钱箱指令被过滤或修改。切换到RAW模式后,驱动会直接传递原始字节流,指令即可正常生效。

内容的提问来源于stack exchange,提问作者MHogge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 17:13:11