2013-03-07 2 views
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? Или кто-нибудь знает, что я могу делать неправильно?

+0

Я думаю, что вы получите больше тяги (лучше управления) с помощью кнопки [SerialPort] (HTTP : //msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx), чем общий FileStream для этого. –

+0

@ 500-InternalServerError прямо сейчас я подключаю его через COM-порт, потому что я понял, что с USB-интерфейсом будет проще, но в самом проекте принтер подключается через USB, поэтому класс SerialPort здесь не вариант. – MarioVW

+0

Почему бы и нет? Как следует из названия, порты USB также являются последовательными портами. –

ответ

Смежные вопросы