如何读回状态从斑马收据打印机
本文关键字:马收 打印机 何读回 状态 | 更新日期: 2023-09-27 18:02:42
我正在为一个项目使用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.Write()
后调用stream.Flush()
,但仍然没有读取(也没有打印,直到我调用stream.Close()
) - 只发送命令,然后关闭流,立即重新打开并尝试读取
- 打开两个句柄,写入句柄1,关闭句柄1,读取句柄2。没有
有人有幸从Zebra打印机读取回状态吗?或者有人知道我哪里做错了吗?
正如@l33tmike在评论中指出的那样,这个问题的答案已经发布在另一个问题上:我应该为KR403 Zebra Printer使用哪个SDK