我正在使用Zebra KR403收据打印机进行项目,我需要以编程方式从打印机中读取状态(纸张,纸张近端,打印头打开,卡纸等)。在ZPL文档中,我发现我需要发送~HQES
命令,打印机会回复其状态信息。
在项目中,打印机通过USB连接,但我认为可能更容易通过COM端口连接打印机并从那里开始工作以使其通过USB工作。我可以打开与打印机的通信并向它发送命令(我可以打印测试收据),但每当我尝试阅读任何内容时,它只会永远挂起,永远不会读取任何内容。
这是我正在使用的代码:
public Form1()
{
InitializeComponent();
SendToPrinter("COM1:", "^XA^FO50,10^A0N50,50^FDKR403 PRINT TEST^FS^XZ", false); // this prints OK
SendToPrinter("COM1:", "~HQES", true); // read is never completed
}
[DllImport("kernel32.dll", SetLastError = true)]
static extern SafeFileHandle CreateFile(
string lpFileName,
FileAccess dwDesiredAccess,
uint dwShareMode,
IntPtr lpSecurityAttributes,
FileMode dwCreationDisposition,
uint dwFlagsAndAttributes,
IntPtr hTemplateFile);
private int SendToPrinter(string port, string command, bool readFromPrinter)
{
int read = -2;
// Create a buffer with the command
Byte[] buffer = new byte[command.Length];
buffer = System.Text.Encoding.ASCII.GetBytes(command);
// Use the CreateFile external func to connect to the printer port
using (SafeFileHandle printer = CreateFile(port, FileAccess.ReadWrite, 0, IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero))
{
if (!printer.IsInvalid)
{
using (FileStream stream = new FileStream(printer, FileAccess.ReadWrite))
{
stream.Write(buffer, 0, buffer.Length);
// tries to read only one byte (for testing purposes; in reality many bytes will be read with the complete message)
if (readFromPrinter)
{
read = stream.ReadByte(); // THE PROGRAM ALWAYS HANGS HERE!!!!!!
}
stream.Close();
}
}
}
return read;
}
我发现当我打印测试收据(第一次调用SendToPrinter()
)时,在我用stream.Close()
关闭句柄之前,没有任何内容被打印出来。我做了这些测试,但无济于事:
stream.Flush()
后致电stream.Write()
,但仍未读取任何内容(在我致电stream.Close()
之前,没有任何内容被打印)有没有人有幸从Zebra打印机回读状态?或者任何人都知道我可能做错了什么?
答案 0 :(得分:0)
正如@ l33tmike在评论中指出的那样,这个问题的答案已经发布在另一个问题上:Which SDK should I use for KR403 Zebra Printer