プロジェクトで 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 プリンタからステータスを読み取ることができた人はいますか? または、誰かが私が間違っているかもしれないことを知っていますか?