4
我爲項目使用Zebra KR403收據打印機,並且需要以編程方式從打印機讀取狀態(缺紙,近端紙張,打印頭打開,卡紙等)。在ZPL文檔中,我發現我需要發送一個~HQES
命令,並且打印機迴應其狀態信息。如何從Zebra收據打印機讀回狀態?
在這個項目中,打印機通過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.什麼
有沒有人有任何運氣從斑馬打印機回讀狀態?或者任何人有任何想法,我可能做錯了什麼?
我想你會獲得更多的牽引力(更好的控制)[的SerialPort(HTTP ://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx)類比一般的FileStream爲此。 – 2013-03-07 18:46:20
@ 500-InternalServerError現在我通過COM端口連接它,因爲我認爲這會比USB更容易,但在實際項目中,打印機通過USB連接,因此SerialPort類不是此處的選項。 – MarioVW 2013-03-07 19:22:58
爲什麼不呢?顧名思義,USB端口也是串行端口。 – 2013-03-07 19:25:54