4

我正在为一个项目使用 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 打印机读回状态?或者有人知道我可能做错了什么吗?

4

1 回答 1

0

正如@l33tmike 在评论中指出的那样,这个问题的答案已经发布在另一个问题上:我应该为 KR403 Zebra 打印机使用哪个 SDK

于 2013-08-01T19:59:08.503 回答