如何读回状态从斑马收据打印机

本文关键字:马收 打印机 何读回 状态 | 更新日期: 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