Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.10.16;
Скачать: [xml.tar.bz2];

Вниз

Печать наклейки на USB-принтере   Найти похожие ветки 

 
>|<   (2011-06-22 15:32) [0]

У кого есть опыт, помогите с решением проблемы.
Суть такова: Раньше принтер подключался через COM или LTP порты.
Теперь необходимо добавить USB порт.
Указал адрес USB001, но эффект нулевой.
Принтер специфический, заточен под печать штрих кодов.
Могу привести код, как это работало раньше.

procedure TfPrintBarCode.btnPrintClick(Sender: TObject);
var
 F: TextFile;
 i, cnt: integer;
 isPrintedOK: boolean;
 procedure WriteLine(ACommands: string);
 begin
   if IsPPLA() then
   begin
     ACommands := StringReplace(ACommands, "<STX>", chr($02), [rfReplaceAll]);
     ACommands := StringReplace(ACommands, "<SOH>", chr($01), [rfReplaceAll]);
     ACommands := StringReplace(ACommands, "<CR>", "", [rfReplaceAll]);
   end; //if
   //
   if FPrinterIndex = cDirectPrinting then
     Writeln(F, ACommands) // Direct Printing
   else
     Writeln(F, "${" + ACommands + "}$");
 end;
 procedure Init();
 begin
   if IsPPLA() then
     exit;
   //==
   WriteLine(""); // Инициализация
   WriteLine("I8,C,001"); // Set: 8-bit, Codepage Win1251, U.S.A.
 end;

 function Prepare_SN_For_PPLA(ASN: string): string;
 begin
   if ASN[1] in ["A", "B", "C"] then
     ASN := "B" + ASN;
   result := ASN;
 end;

 procedure PrintBody(ASpecifiedSN: string = "");
 var
   sBarCode, sX, sY, sH, shv, s_tmp: string;
 begin
   if ASpecifiedSN = "" then
     sBarCode := GetNextSerial() // сами сгенерировали следующий СН
   else
     sBarCode := ASpecifiedSN; // указали конкретный СН
   ///
   if IsPPLA() then
   begin // Rthvoooyyyyxxxx[data string] - text & barcode
     sBarCode := Prepare_SN_For_PPLA(sBarCode);
     // слово KyivStar
     WriteLine("<STX>L");
     sY := "0097"; // по умолчанию
     case LabelSize of
       ls52x30: sX := "0155";
       ls58x30: sX := "0180";
       ls40x10:
         begin
           sX := "0080";
           sY := "0050";
         end; // еще не тестилось
     end; //case
     s_tmp := "KyivStar";
     if ASpecifiedSN <> "" then
       s_tmp := "***";
     if not (LabelSize in [ls27x09]) then
       WriteLine("1011000" + sY + sX + s_tmp);
     // сам штрих-код
     sY := "0013";
     sH := "045";
     shv := "21"; // по умолчанию
     case LabelSize of
       ls52x30: sX := "0012";
       ls58x30: sX := "0030";
       ls40x10:
         begin
           sX := "0010";
           sY := "0004";
           sH := "035";
         end; // еще не тестилось
       ls27x09:
         begin
           sX := "0003";
           sY := "0003";
           sH := "020";
           shv := "11";
         end;
     end; //case
     WriteLine("1E" + shv + sH + sY + sX + sBarCode); // code128
     WriteLine("E");
   end
   else
   begin
     WriteLine("N");
     if LabelSize = ls52x30 then
       sX := "300"
     else if LabelSize = ls58x30 then
       sX := "330";
     WriteLine("A" + sX + ",6,0,1,1,1,N,"КиївСтар""); //X=330
     if LabelSize = ls52x30 then
       sX := "20"
     else if LabelSize = ls58x30 then
       sX := "45";
     WriteLine("B" + sX + ",77,0,3,2,4,80,B,"" + sBarCode + """); //X=40
     WriteLine("P1"); // Печать 1 раз
   end;
 end;
begin
 if FPrinterIndex = -666 then
 begin
   WarnDlg("Выберите принтер !");
   btnSelectPrinter.SetFocus;
   exit;
 end;
 //==
 cnt := trunc(spinCount.value);
 if cnt < 1 then
 begin
   WarnDlg("Введено недопустимое количество этикеток !");
   spinCount.SetFocus;
   exit;
 end;
 //==
 if FPrinterIndex <> cDirectPrinting then
   CheckPrinterName(Printer.Printers[Printer.PrinterIndex]);
 //
 if not ConfirmDlgSimple("Выполнить печать с указанными параметрами ?") then
   exit;
 //==
 isPrintedOK := false;
 try
   btnPrint.Enabled := false;
   try
     try
       if FPrinterIndex = cDirectPrinting then
       begin
         AssignFile(F, edtPrinterName.Text); // Direct Printing
         Rewrite(F);
         Init();
         if FisAutonomous then
           for i := 1 to cnt do
             PrintBody()
         else
           for i := 1 to FSN_List.Count do
             PrintBody(FSN_List.Strings[i - 1]);
         isPrintedOK := true;
       end;
     finally
       System.CloseFile(F);
     end;
   except
     on E: Exception do
     begin
       ErrorDlg("Ошибка печати:"#13 +
         "======================="#13 +
         E.Message);
     end;
   end;
 finally
   btnPrint.Enabled := true;
 end;
 //
 if isPrintedOK and not FisAutonomous then
   ModalResult := mrOK; // напечатали и самозакрылись
end;


Когда указываю имя принтера USB001(это адрес принтера) - создает файл с таким именем и пишет в него. То есть, напрямую в этот порт не отправляет данные, как было с COM-портом, а пишет в файл с таким именем.

Кто знает, подскажите, в каком направлении копать?
Скачал книгу "Интерфейс USB. Практика использования и программирования (П.Агуров) "
Но на ее изучение уйдет много времени и про работу именно с принтером через USB там ничего нету.

Заранее благодарен за любую помощь.


 
SQLEXPRESS   (2011-06-22 15:35) [1]

принтер. марка. ?.


 
SQLEXPRESS   (2011-06-22 15:37) [2]

вернее, не "штрих-принт %Number%" - с этими возился


 
Игорь Шевченко ©   (2011-06-22 15:46) [3]

Вроде есть для USB-принтеров переназначение имен портов


 
oxffff ©   (2011-06-22 15:51) [4]

with net use lpt1: \\computername\printername /y


 
oxffff ©   (2011-06-22 15:52) [5]

http://social.msdn.microsoft.com/Forums/en-US/windowscompatibility/thread/9a4dbfa8-ca8c-4570-b333-a09769cf934a/


 
DiamondShark ©   (2011-06-22 15:57) [6]

Все хитровыпендренные лэйбл-принтеры, которые мне попадались (а их мне попадалось много), подключались к USB только по двум сценариям:
1. как виртуальный COM порт
2. как виндовый принтер
В первом случае всё тривиально, а во втором случае есть функция WritePrinter.

Что происходит, когда этот принтер подключается? Как какое устройство он определяется?


 
>|<   (2011-06-22 16:05) [7]


> with net use lpt1: \\computername\printername /y

Будет ли работать эта комманда, если lpt-порт физически отсутствует в системе(новый ноутбук)?


> принтер. марка. ?.

Label Dr 200 (2 inch model)


> Вроде есть для USB-принтеров переназначение имен портов

Как вариант, думал установить драйвер, который USB будет видеть как очередной COM-порт.

В результате поиском по инету понял, что напрямую в USB, как в COM-порт писать нельзя.
Умные люди советуют:
1) Проэнумеровать усб-девайсы через сервисные функции SetupDiGetClassDevs/SetupDiEnumDeviceInterfaces.
2) В процессе выполнения пункта 1, запрашивать детали устройства через SetupDiGetDeviceInterfaceDetail и в случае нахождения требуемых вендорИД и продуктИД - узнаём указанный в PSP_DEVICE_INTERFACE_DETAIL_DATA::DevicePath интерфейс драйвера нужного нам девайса.
3) Используя CreateFile открываем найденный интерфейс и шлём/принимаем ему/от него команды...


 
>|<   (2011-06-22 16:10) [8]


> 1. как виртуальный COM порт

подскажите драйвер(где скачать), который из USB-порта сделает виртуальный COM порт


 
oxffff ©   (2011-06-22 16:11) [9]


> Будет ли работать эта комманда, если lpt-порт физически
> отсутствует в системе(новый ноутбук)?


Должна.
net use lpt1: \\computername\printername /y


 
DiamondShark ©   (2011-06-22 16:11) [10]


> где скачать

У производителя принтера


 
DiamondShark ©   (2011-06-22 16:15) [11]


> >|<   (22.06.11 16:05) [7]
> > with net use lpt1: \\computername\printername /y
> Будет ли работать эта комманда, если lpt-порт физически отсутствует
> в системе(новый ноутбук)?

А у тебя на \\computername есть \printername ?
Значит, у тебя есть и драйвер принтера. Значит ты можешь юзать OpenPrinter и WritePrinter.


 
>|<   (2011-06-22 16:19) [12]


> with net use lpt1: \\computername\printername /y

этот вариант не работает. проверили.


 
>|<   (2011-06-22 16:26) [13]


> Значит ты можешь юзать OpenPrinter и WritePrinter.

тогда надо будет поддерживать две реализации кода: одна для COM, LPT, другая - для USB

Проще создать еще один виртуальный COM-порт и перенаправить его в USB.
Сейчас выясняю, где к нему дрова и сайт производителя.


 
oxffff ©   (2011-06-22 16:36) [14]


> >|<   (22.06.11 16:19) [12]
>
> > with net use lpt1: \\computername\printername /y
>
> этот вариант не работает. проверили.


Насколько  помню, я использовал такой способ для DOS программ при печати на сетевые принтеры. Вроде были и USB тогда принтеры. И все работало.


 
DiamondShark ©   (2011-06-22 16:51) [15]


> тогда надо будет поддерживать две реализации кода: одна
> для COM, LPT, другая - для USB

Ну ты как будто первый раз замужем.
Пишешь свой код, чтобы он работал с абстрактным TStream. 99% твоего кода по-барабану, куда чего писать, в ком, в усб или в межгалактический нуль-т трансивер.
Потом пишешь два примитивненьких классика: TComStream и TPrinterStream. И твой код с ними прекрасно работает.
Потом у тебя появляется принтер с вай-фаем, принтер с блютусом и принтер на королевской фельдегерской связи. ИЧСХ, твой код начинает с ними работать! Путём написания классиков на десяток строк содержательного кода.


 
>|<   (2011-06-22 17:20) [16]


> Пишешь свой код, чтобы он работал с абстрактным TStream.
>  99% твоего кода по-барабану, куда чего писать, в ком, в
> усб или в межгалактический нуль-т трансивер.
> Потом пишешь два примитивненьких классика: TComStream и
> TPrinterStream. И твой код с ними прекрасно работает.
> Потом у тебя появляется принтер с вай-фаем, принтер с блютусом
> и принтер на королевской фельдегерской связи. ИЧСХ, твой
> код начинает с ними работать! Путём написания классиков
> на десяток строк содержательного кода.

Согласен.
Если не найду драйвер для виртуального СОМ-порта, так и сделаю.


 
>|<   (2011-06-22 17:40) [17]


> OpenPrinter и WritePrinter.

Это методы какого класса/модуля? в справке такого не нашел...


 
DiamondShark ©   (2011-06-22 18:39) [18]


> Это методы какого класса/модуля? в справке такого не нашел.

Это функции winspool.dll
http://msdn.microsoft.com/en-us/library/dd162861(v=VS.85).aspx
В каком модуле дельфи описан их импорт, и описан ли вообще, я не знаю. Руками заголовки импорта написать -- три минуты работы.

Для прямой записи сырых данных в принтер нужно:
OpenPrinter -- получаем хэндл нужного принтера
StartDocPrinter -- стартует задание спулера
WritePrinter -- собственно, передача данных
EndDocPrinter -- закрывает задание спулера
ClosePrinter -- закрывает хэндл принтера

Сделать из этого потомка TStream ничуть не сложнее, чем для файлов.


 
>|<   (2011-06-22 18:41) [19]


> Это функции winspool.dll

да, нашел в инете пример
uses WinSpool;
procedure WriteRawStringToPrinter(PrinterName:String; S:String);
var
 Handle: THandle;
 N: DWORD;
 DocInfo1: TDocInfo1;
begin
 if not OpenPrinter(PChar(PrinterName), Handle, nil) then
 begin
   ShowMessage("error " + IntToStr(GetLastError));
   Exit;
 end;
 with DocInfo1 do begin
   pDocName := PChar("test doc");
   pOutputFile := nil;
   pDataType := "RAW";
 end;
 StartDocPrinter(Handle, 1, @DocInfo1);
 StartPagePrinter(Handle);
 WritePrinter(Handle, PChar(S), Length(S), N);
 EndPagePrinter(Handle);
 EndDocPrinter(Handle);
 ClosePrinter(Handle);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 WriteRawStringToPrinter("HP", "Test This");
end;


 
tesseract ©   (2011-06-23 12:53) [20]


> Сделать из этого потомка TStream ничуть не сложнее, чем
> для файлов.


Сложности возникнут с тем, что драйвер принтера может команды обрезать. Рендеренная картинка / текст пройдёт, а вот ZPL/EPL команды могут не пройти.

В zebra в настройках драйвера есть пункт, что то вроде "пропускать команды принтера"


 
>|<   (2011-06-23 16:33) [21]

Написал реализацию с использованием библиотеки WinSpool.
На обычный принтер отправляет на печать и печатает какую-то белиберду.
На принтер этикеток тоже отправляет на печать, задание появляется в очереди печати и через секунду пропадает.
Принтер этикеток на это никак не реагирует.
Пробовал на двух разных моделях.

Пробовал установить виртуальный COM-порт, согласно инструкции, в папке не находит файлы драйверов для этого устройства, хоть они там есть.
Устанавливал этот драйвер http://www.ftdichip.com/Drivers/VCP.htm

В общем, вопрос остается открытым.


 
tesseract ©   (2011-06-23 16:55) [22]


> На принтер этикеток тоже отправляет на печать, задание появляется
> в очереди печати и через секунду пропадает.


Сделай дамп в файл выхода драйвера и посмотри, что драйвер сделал с потоком команд.


> согласно инструкции,


От друга или от производителя принтера ? Драйвер принтера снес с носками из системы ?


 
>|<   (2011-06-23 18:14) [23]


> От друга или от производителя принтера ?


согласно инструкции на сайте производителя драйвера
http://www.ftdichip.com/Support/Documents/InstallGuides.htm

На диске с дровами для принтера драйвера для виртуального СОМ-порта нет.
Поэтому пытался установить драйвер от стороннего производителя.

Возможно, причина в том, что команды, которые передаются на вход принтера, предназначены для модели ARGOX Label Dr 200 (2 inch model)
А само тестирование происходит на модели Integmec PF8t.
Если бы он хотя бы напечатал какой-то бред, но ведь молчит, зараза...


> Сделай дамп в файл выхода драйвера и посмотри, что драйвер
> сделал с потоком команд.

В поставке к принтеру есть PrintMonitor, но при установке он говорит, что совместим только с Win95/98, а для систем выше NT4 есть встроенный монитор, который работает по протоколу TCP/IP
Отсюда сразу наводящий вопрос: чем можно посмотреть это дамп?


 
Galera   (2011-06-23 19:23) [24]

Присоединясь.
Вот это точно должно помочь.
Печатаешь как будто на LPT1 на самом деле все перенаправляется на куда надо. Сам пользовал. Сеть только должна работать.

net use lpt1: \\computername\printername /y


 
tesseract ©   (2011-06-23 22:15) [25]


> Отсюда сразу наводящий вопрос: чем можно посмотреть это
> дамп


Ясн :-)

В настройках принтеров - новый порт - в названии пишешь имя файла на диске. Потом вручную добавляешь принтер или просто у существующего меняешь порт на этот. Теперь точно знаем ЧТО приходит на принтер после обработки драйвером.


> На диске с дровами для принтера драйвера для виртуального
> СОМ-порта нет.


USB-ID  может быть переписан.


> net use lpt1: \\computername\printername /y


Еще раз - нужен raw вывод. А так получишь сюрприз в виде спулера. Никто не мешает писать прямо в printername без лишнего перенаправления.

В принципе насколько я помню, через  CreateFile с printername должно сработать, хотя лучше конечно использовать имя  usb- девайса.

Где-то валялась книга Агурова по USB девайсам, найду напишу как.


 
>|<   (2011-06-24 10:59) [26]


> Где-то валялась книга Агурова по USB девайсам, найду напишу
> как.

она у меня уже второй день открыта, но сразу столько материала переварить нереально.
Проблема еще в том, что сам принтер находится удаленное и мне приходится через другого человека ставить над ним опыты. Нашел похожий у нас на складе, но опять же, там другой встроенный язык и непонятно, какие там дрова стоят, не конфликтуют ли друг с другом...


 
tesseract ©   (2011-06-24 11:38) [27]


> и непонятно, какие там дрова стоят, не конфликтуют ли друг
> с другом...


Конфликты драйверов вроде как давно история уже.


> Проблема еще в том, что сам принтер находится удаленное


Драйвер стоит на локальной машине? Ну и смотри, что тебе в дамп приходит.

Например дамп команд от TSC.


SIZE 102.8 mm, 152.4 mm
DIRECTION 0,0
REFERENCE 0,0
OFFSET 0 mm
SET PEEL OFF
SET CUTTER OFF
SET TEAR ON
CLS
BAR 413, 1215, 406, 2
BAR 413, 1014, 2, 203
BAR 413, 1014, 406, 2
BAR 817, 1014, 2, 203
BAR 419, 1209, 394, 2
BAR 419, 1020, 2, 191
BAR 419, 1020, 394, 2
BAR 811, 1020, 2, 191
BAR 717, 1166, 82, 10
BAR 753, 1055, 10, 121
BAR 626, 1166, 71, 10
BAR 636, 1111, 61, 11
BAR 626, 1055, 71, 10
BAR 687, 1055, 10, 121
BAR 535, 1166, 71, 10
BAR 535, 1111, 71, 11
BAR 535, 1055, 71, 10
BAR 596, 1110, 10, 66
BAR 535, 1055, 10, 66
BAR 433, 1166, 81, 10
BAR 469, 1055, 10, 121
PRINT 1,1



 
DiamondShark ©   (2011-06-24 12:08) [28]

Сейчас ради прикола снёс дрова свой Зебры (QL320+), поставил драйвер "Generic/Text Only", нарисовал в зебровском дизайнере наклейку, открыл её Блокнотом и отправил на печать с галкой "печатать в файл". В файле оказались лишние пробелы и <LF>, типа, поля. В настройках страницы поставил все поля в ноль, и отправил на печать.
Зебра радостно выдристала этикетку.

Набросал примерчик с WritePrinter.
Отправил один раз в файл, один раз на принтер. Принтер печатает, а содержимое файла до бита совпадает с тем, что отправилось вызовом WritePrinter.

Принтер подключён по УСБ.

Generic/Text Only -- нашефсё!

По-моему, ТС и отвечающие занимаются взаимным толстым троллингом.


 
tesseract ©   (2011-06-24 13:51) [29]


> По-моему, ТС и отвечающие занимаются взаимным толстым троллингом.


Драйвер зебры может пропускать команды. Не все термопринтеры ведут себя так-же.


 
DiamondShark ©   (2011-06-24 14:52) [30]


> Драйвер зебры может пропускать команды.

Драйвер зебры был выпилен чуть более, чем полностью.
Печаталось через драйвер Generic/Text Only. Он пропускает всё.


 
tesseract ©   (2011-06-24 15:07) [31]


> Печаталось через драйвер Generic/Text Only. Он пропускает
> всё.


Тогда никаких вопросов :-) Там точно ничего не изменяется.


 
>|<   (2011-06-24 15:10) [32]


> По-моему, ТС и отвечающие занимаются взаимным толстым троллингом.

делать мне нечего... есть проблема и я пытаюсь понять как ее решить.

На ARGOX купили переходник usb2com, но он все равно не печатает.
Может у него драйвер для работы через usb кривой... предложил им снести его, жду ответа.


> Печаталось через драйвер Generic/Text Only.

а что это за драйвер и где его взять?


 
tesseract ©   (2011-06-24 16:02) [33]


> На ARGOX купили переходник usb2com, но он все равно не печатает.


Смотреть в сторону инициализации порта.


 
DiamondShark ©   (2011-06-24 18:24) [34]

>|<   (24.06.11 15:10) [32]

> > Печаталось через драйвер Generic/Text Only.
> а что это за драйвер и где его взять?

Драйвер из дистрибутива винды.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2011.10.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.003 c
15-1308836003
картман
2011-06-23 17:33
2011.10.16
как эта задачка решается Хорошо?


15-1308984778
oleg1963lora
2011-06-25 10:52
2011.10.16
Хост в 40 Гб бесплатно на 48 часов. Возможно ли это?


15-1308682059
Кто б сомневался
2011-06-21 22:47
2011.10.16
На сколько уменьшается продолжительность дня после 22 июня?


2-1309426335
handle
2011-06-30 13:32
2011.10.16
проверка существования атрибутов


8-1217186194
Алекс
2008-07-27 23:16
2011.10.16
Проблема с отрисовкой Image.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский