我正在为一个项目使用 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()
) - 只发送命令然后关闭流,立即重新打开并尝试读取
- 打开两个句柄,在句柄 1 上写入,关闭句柄 1,读取句柄 2。什么都没有
有没有人有幸从 Zebra 打印机读回状态?或者有人知道我可能做错了什么吗?