我正在使用带有WPF的c#开发POS。我需要检查现金抽屉是否打开,告诉用户在下次销售之前需要关闭它。
我的现金抽屉是连接到收据打印机ECLine的dynapos(我没有安装驱动程序,只使用Windows中的通用),此打印机通过USB连接到PC。到目前为止,我可以使用RawPrinterHelper打印并使用以下方式打开cashdrawer:
byte[] codeOpenCashDrawer = new byte[] { 27, 112, 48, 55, 121 };
IntPtr pUnmanagedBytes = new IntPtr(0);
pUnmanagedBytes = Marshal.AllocCoTaskMem(5);
Marshal.Copy(codeOpenCashDrawer, 0, pUnmanagedBytes, 5);
RawPrinterHelper.SendBytesToPrinter(stringPrinterName, pUnmanagedBytes, 5);
Marshal.FreeCoTaskMem(pUnmanagedBytes);
以同样的方式我可以打开现金抽屉,我希望通过发送一些字节来获得它的状态。我找到了this解决方案,其中说:
要获得抽屉的状态,我需要使用DLE EOT n
问题在于我无法知道字节是否是好字节,因为在使用RawPrinterHelper
方法时我无法从SendBytesToPrinter
获得响应。
问题:
1)有没有办法使用RawPrinterHelper获取此状态?
2)如果我发送的字节不正确,我怎样才能确定哪些是正确的?
3)我是否需要为打印机安装驱动程序?我已经阅读了一些人这样做,但我不想这样做,因为安装POS的地方有不同的硬件。
答案 0 :(得分:1)
使用您正在使用的Windows打印后台处理程序API,应用程序无法知道打印机/现金抽屉状态
根据打印机的供应商,您可能提供了具有自己的扩展功能的设备驱动程序,以了解状态
例如,EPSON provides a status API function with the name Advanced Printer Driver.(因为找不到英文解释页面,引入日文页面)
如果这些扩展API可用,请咨询您的打印机供应商
如果没有扩展API,则考虑以下方法之一
1.切换到存在扩展API的EPSON等打印机
2.将打印机切换到作为连接到COM端口而不是Windows打印机的外围设备的模式,并使用COM端口直接发送和接收ESC / POS命令和响应。
3.为.NET / JavaPOS安装一个OPOS / POS,并在打印机和现金抽屉的控制方式之间切换。