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())
  • コマンドのみを送信してからストリームを閉じ、すぐに再度開いて読み取りを試みます
  • 2 つのハンドルを開き、ハンドル 1 に書き込み、ハンドル 1 を閉じ、ハンドル 2 を読み取ります。

Zebra プリンタからステータスを読み取ることができた人はいますか? または、誰かが私が間違っているかもしれないことを知っていますか?

4

1 に答える 1