如何从Zebra收据打印机回读状态?

时间:2013-03-07 16:37:46

标签: c# .net zebra-printers zpl

我正在使用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打印机回读状态?或者任何人都知道我可能做错了什么?

1 个答案:

答案 0 :(得分:0)

正如@ l33tmike在评论中指出的那样,这个问题的答案已经发布在另一个问题上:Which SDK should I use for KR403 Zebra Printer