Отправка необработанных данных на принтер Zebra TTP 2030 и получение его статуса

Я работаю над веб-приложением .net c#, где мне нужно печатать на принтере Zebra (TTP2030) текст и штрих-коды. Используя класс RawPrinterHelper здесь. Я в значительной степени получил команды для принтера в виде строки юникода.

Итак, чтобы напечатать штрих-код, я делаю:

string enq = Convert.ToChar(5).ToString();
string esc = Convert.ToChar(27).ToString();
string nul = Convert.ToChar(0).ToString();
string rs = Convert.ToChar(30).ToString();
string lf = Convert.ToChar(10).ToString();
string cr = Convert.ToChar(13).ToString();

StringBuilder sb = new StringBuilder();

sb.Append(esc + "BS" + nul + nul + Convert.ToChar(72).ToString() + nul + nul);
sb.Append(nul + nul + Convert.ToChar(64).ToString() + nul + Convert.ToChar(2).ToString() + Convert.ToChar(2).ToString());
sb.Append(esc + "BW" + nul + "733104000099" + nul);
sb.Append(lf + rs);

RawPrinterHelper.SendStringToPrinter(printerName, sb.ToString());

Мнемоника для этой команды

< ESC>BS<0><0>< h 48><0><0>
<00><0>< h 40><0><2><2>
< ESC>BW<00>733104000099<00>
< LF>< RS>

Чего я не знаю, так это правильно ли я отправляю такие вещи, как ‹ h 48>. В руководстве ведущая цифра h, за которой следует пробел, указывает на шестнадцатеричное значение. В данном случае это значение представляет собой координату X (младший байт — я не знаю, что это такое) штрих-кода.

Если это значение в пикселях (или миллиметрах), как мне преобразовать его в шестнадцатеричный формат, а затем в юникод, который я отправляю на принтер?

Кроме того, как мне преобразовать десятичные значения, которые я должен отправить?

Например, для печати строки линейки я отправляю:

< ESC>r<0><0><0><0><1><230><0><24><3>

Все это десятичные значения, означающие позицию, начало, остановку и т. д.

Как мне преобразовать эту команду, чтобы я мог отправить ее на принтер?

Еще одна вещь, которую я не могу заставить работать, — это получение данных с принтера. Доступно несколько команд, таких как получение состояния бумаги, серийного номера, прошивки и т. д. Чтобы сначала попытаться добиться этого, я добавил

[DllImport("winspool.drv", CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
    public static extern int ReadPrinter(IntPtr hPrinter, StringBuilder data, int buf, out int pcRead);

в RawPrinterHelper классе. Затем я попытался отправить команду, используя SendFileToPrinter и файл .prn, который я сохранил из небольшого приложения под названием kiosk printer toolbox, полученного с веб-сайта zebra.

(Я решил отправить файл вместо подхода SendStringToPrinter, описанного выше, потому что, ну, я не верю, что поступаю правильно, а также я протестировал отправку файла команд на принтер с несколькими разными командами, и это работал).

Затем вызывается ReadPrinter(hPrinter, sb, 6, out dwWritten);, но sb пусто. Метод возвращает 0. Кто-нибудь знает, как я могу прочитать данные с принтера? Есть ли совершенно другой подход, который мне следует рассмотреть для печати (текста и штрих-кодов) и получения состояния принтера?


person bfi    schedule 01.06.2010    source источник
comment
В качестве обновления по этому поводу я отказался от winspool.drv в пользу чтения и записи непосредственно в порт USB, используя LibUsbDotNet. С помощью winspool я не смог получить никаких данных с принтера, с помощью ReadPrinter или GetPrinterData (скорее всего я не умею ими пользоваться, ничего полезного по теме не нашел). LibUsbDotNet — отличная библиотека, и я мог легко отправлять команды на принтер (так же, как описано выше) и получать из него данные. Единственная проблема, с которой я сейчас сталкиваюсь, - это преобразование десятичных и шестнадцатеричных значений для команд принтера и преобразование вывода во что-то читаемое.   -  person bfi    schedule 04.06.2010


Ответы (1)


В java есть специальная функция, которая делает это. Я бы проверил QZ-Print. Вы сможете печатать только на принтере, который работает локально на вашем домашнем компьютере с веб-приложениями, никто другой не сможет. Я бы проверил этот апплет на предмет того, что вы хотите сделать. IT был специально написан для принтеров Zebra.

person mathis1337    schedule 23.07.2014