Я использую принт-принтер 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? Или кто-нибудь знает, что я могу делать неправильно?
Я думаю, что вы получите больше тяги (лучше управления) с помощью кнопки [SerialPort] (HTTP : //msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx), чем общий FileStream для этого. –
@ 500-InternalServerError прямо сейчас я подключаю его через COM-порт, потому что я понял, что с USB-интерфейсом будет проще, но в самом проекте принтер подключается через USB, поэтому класс SerialPort здесь не вариант. – MarioVW
Почему бы и нет? Как следует из названия, порты USB также являются последовательными портами. –