【发布时间】:2012-01-04 05:21:48
【问题描述】:
我正在使用 Microsoft 的 RawPrinterHelper 类 http://support.microsoft.com/kb/322091 从 C# 代码打印到 Zebra KR403 打印机,一切正常。
我希望监控打印机的卡纸和断纸状态。我找到了一个可以发送到打印机的查询“~HQES”或“esc eng 6”,它将返回我需要的所有内容。问题是我无法弄清楚如何将此查询发送到允许打印机响应的打印机。 RawPrinterHelper 类中的 WritePrinter 似乎只返回 bool 或 long 类型。
我还尝试使用Win32_printer 对象来查找打印机的PrinterStatus/PrinterState/Errors。使用以下方法:
public static string PrinterStateCheck(string szPrinterName)
{
string query = string.Format("SELECT * from Win32_Printer WHERE Name LIKE '%{0}%'", szPrinterName);
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection collection = searcher.Get();
string errorName = "";
foreach (ManagementObject printer in collection)
{
int state = Convert.ToInt32(printer["PrinterState"]);
errorName = state.ToString();
}
return errorName;
使用此方法,我尝试获取PrinterState、PrinterStatus 和DetectedErrorState,但这些都没有响应我需要的信息。 PrinterState 总是返回 1024,PrinterStatus 总是返回 4,DetectedErrorState 总是返回 2。尽管PrinterState 确实在正确打印时返回了0,在卡纸或媒体输出事件中返回了1024,但现在它只是在每次调用时返回1024。
我还发现 Zebra 开发了自己的软件来监控网络上的打印机。问题是我们的打印机不在网络上,仅通过 USB 连接到客户端计算机。此外,我们希望在打印每张收据之前或之后检查打印机的状态。
我希望 winspool.Drv 有一些东西可以用来将原始数据发送到打印机并从打印机接收数据。
现在我正在使用winspool.Drv 的ReadPrinter 函数,但该函数返回0,这意味着无法访问来自打印机的响应。这通常意味着打印机没有设置为双向通信,但我确信它是。在打印机属性的“端口”选项卡中选中“启用双向支持”复选框。此外,Zebra Setup Utilities 可以正确查询打印机并在其直接通信窗口中接收响应。
感谢您的建议,
杰里米
【问题讨论】:
-
我已经有几年没有做过 ZPL了……Zebra 是否支持 PJL?如果是这样,您也许可以使用它。
-
谢谢道格拉斯。我认为这台打印机(KR403)不支持 PJL。我不确定,但我还没有找到任何文献说它确实如此。我可以将 ZPL
~HQES命令发送到打印机,但我无法在我的代码中读取打印机的回复。目前我正在尝试按照Zebra Language MonitorRC 中的描述实现GetPrinterData,但是每次启动线程时程序都会崩溃。 -
在给 Zebra 支持团队发送电子邮件后,我被告知 KR403 打印机驱动程序不支持
GetPrinterData。它用于 Zebra 生产的另一台自助服务终端打印机。
标签: printing status zebra-printers thermal-printer zpl