2013-03-07 111 views
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.什麼

有沒有人有任何運氣從斑馬打印機回讀狀態?或者任何人有任何想法,我可能做錯了什麼?

+0

我想你會獲得更多的牽引力(更好的控制)[的SerialPort(HTTP ://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx)類比一般的FileStream爲此。 – 2013-03-07 18:46:20

+0

@ 500-InternalServerError現在我通過COM端口連接它,因爲我認爲這會比USB更容易,但在實際項目中,打印機通過USB連接,因此SerialPort類不是此處的選項。 – MarioVW 2013-03-07 19:22:58

+0

爲什麼不呢?顧名思義,USB端口也是串行端口。 – 2013-03-07 19:25:54

回答