我最近创建了一个java程序,它打印收据并打开连接到打印机的现金抽屉。
现在我需要打开现金抽屉,它将通过RJ11直接连接到电脑。
由于我不会将现金抽屉连接到打印机,因此我feedPrinter
将毫无用处。那么如何调用现金抽屉并发送命令?
这是我的代码
public String openDrawer()
{
final byte[] openCD={27,112,0,60,120};
String s=new String(openCD);
commandSet+=s;
return s;
}
public static void main(String args[])
{
PrinterOptions p=new PrinterOptions();
p.openDrawer();
feedPrinter(p.finalCommandSet().getBytes());
}
private static boolean feedPrinter(byte[] b)
{
try
{
AttributeSet attrSet = new HashPrintServiceAttributeSet(new PrinterName("PRINTERNAME", null));
//what should I change PRINTERNAME to connect directly to cash drawer
DocPrintJob job = PrintServiceLookup.lookupPrintServices(null, attrSet)[0].createPrintJob();
DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
Doc doc = new SimpleDoc(b, flavor, null);
PrintJobWatcher pjDone = new PrintJobWatcher(job);
job.print(doc, null);
pjDone.waitForDone();
System.out.println("Done !");
}
catch(javax.print.PrintException pex)
{
System.out.println("Printer Error " + pex.getMessage());
return false;
}
catch(Exception e)
{
e.printStackTrace();
return false;
}
return true;
}
public String finalCommandSet()
{
return commandSet;
}
答案 0 :(得分:1)
首先,从中获取打印机的抽屉/刀具代码 http://keyhut.com/popopen4.htm
我的打印机的抽屉代码是= 27,112,0,100,250
然后,使用以下代码打开现金抽屉。
public void openCashDrawer() {
byte[] open = {27,112,0,100,(byte) 250};
// byte[] cutter = {29, 86,49};
PrintService pservice =
PrintServiceLookup.lookupDefaultPrintService();
DocPrintJob job = pservice.createPrintJob();
DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE;
Doc doc = new SimpleDoc(open,flavor,null);
PrintRequestAttributeSet aset = new
HashPrintRequestAttributeSet();
try {
job.print(doc, aset);
} catch (PrintException ex) {
System.out.println(ex.getMessage());
}
}
这应该有用。
谢谢。
答案 1 :(得分:0)
不确定技术细节,但作为代码评论:
String s = new String(openCD, StandardCharsets.ISO_8859_1);
feedPrinter(p.finalCommandSet().getBytes(StandardCharsets.ISO_8859_1));
如果不指定编码,则使用默认平台编码。这是一种不可移植的编程方式。在使用UTF-8的Unicode机器上,这会出错:openCD
不是有效的UTF-8字节序列。
但当然更好:
ByteArrayOuputStream commandSet;
public void openDrawer()
{
final byte[] openCD={27,112,0,60,120};
commandSet.write(openCD);
}
public static void main(String args[])
{
PrinterOptions p=new PrinterOptions();
p.openDrawer();
feedPrinter(p.commandSet.toByteArray());
}
答案 2 :(得分:0)
由于打印机显然是由Esc序列控制的,因此它将按原样工作。对于打印机,通过串行接口(或其他)接收的序列与收到的相同序列具有完全相同的含义通过Centronics界面(或其他)。
您只需要确保新连接正确传输数据,无论如何都要传输数据。
更新
但请注意,我可能错了你:我认为你指的是通过Centronics连接打印机而不是以不同的方式连接打印机。
您所说的是在不使用打印机的情况下将现金抽屉直接连接到计算机。 然后,当然,如果没有进一步的努力它将无法工作,因为打印机不会解释Esc序列,或者至少不会打开抽屉。
如果您提供有关抽屉界面的详细信息,我们都知道更多。
答案 3 :(得分:0)
最好是将现金抽屉连接到收据打印机而不是直接连接到计算机,并且发送和ESC命令打开应该可以工作。 但是,如果你不能这样做,我通过使用jnpout32pkg.dll直接写入RJ11端口让它在某些计算机上工作。但是,RJ11的地址对于不同的硬件似乎有所不同,因此您必须找出要写入的地址。但是这种方法也可以让你读取现金抽屉是否开放(这是挪威目前的新要求......)