Я использую LibUsbDotNet для связи с моим принтером GC420t Zebra.
Он отлично работает, когда дело доходит до печати:
MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder);
if (MyUsbDevice == null) throw new Exception("Device Not Found.");
IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
if (!ReferenceEquals(wholeUsbDevice, null))
{
wholeUsbDevice.SetConfiguration(1);
wholeUsbDevice.ClaimInterface(0);
}
UsbEndpointWriter writer = MyUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep01);
int bytesWritten;
if (writer.Write(Encoding.Default.GetBytes(someString), 2000, out bytesWritten) != ErrorCode.None)
throw new Exception(UsbDevice.LastErrorString);
Но я не могу найти способ заставить мой код читателя работать... Всегда возвращает 0 прочитанных байтов. Я поставил его прямо в конце приведенного выше кода, крышка моего принтера открыта (что, безусловно, должно дать мне какой-то код ошибки).
UsbEndpointReader reader = MyUsbDevice.OpenEndpointReader(ReadEndpointID.Ep01);
// above code...
ErrorCode ec = ErrorCode.None;
byte[] readBuffer = new byte[1024];
while (ec == ErrorCode.None)
{
int bytesRead;
ec = reader.Read(readBuffer, 5000, out bytesRead);
Console.WriteLine("{0} bytes read", bytesRead);
Console.Write(Encoding.Default.GetString(readBuffer, 0, bytesRead));
}
Если вы знаете, как это сделать... Или если вы знаете лучший/быстрый/более простой способ сделать это, я возьму его, спасибо.
РЕДАКТИРОВАТЬ: Итак, я попробовал еще несколько вещей, провел еще несколько исследований.
Доступ к состоянию принтера с помощью winspool -> Возвращено 0 хотя я удалил носитель из своего принтера, аккуратно. Ну, я думаю, он просто инициализирован 0 и не получает никакого значения. Этот код использует шаблон OpenPrinter/GetPrinter/ClosePrinter
.
LibUsbDotNet -> Пробовал все перечисленные способы чтения состояния, всегда читается 0 байт.
RawPrinterHelper -> Работает для печати, не нашел способ получить статус однако.
Затем я что-то прочитал (не помню, на каком сайте) о том, что вы должны были прочитать статус, пока принтер печатал. Как это можно сделать?
РЕДАКТИРОВАТЬ: Для полноты картины я генерирую свои команды для принтера (что, вероятно, не поможет, поскольку, опять же, он работает безупречно, когда дело доходит до печати):
StringBuilder sb = new StringBuilder().AppendLine()
.AppendLine("N")
.AppendLine("^ee") // The "give me an answer" code, also tested at the end of the commands, or as the only command (with newline and N)
// more appending...
.AppendLine(String.Format("P{0},{1}", 1, 1));
РЕДАКТИРОВАТЬ: Просто для протокола, причина, по которой я совершенно уверен, что вы можете получить статус этого GC420t ... заключается в том, что вы просто можете это сделать с помощью Zebra Setup Utilities. Если вы отправите ^ee с помощью предоставленного инструмента (Открыть связь с принтером), вы получите правильный код ошибки. Мне просто нужно знать, как это делается.