Добрый день, коллеги.
Хочу поделиться со всеми решением проблемы, описанной в заголовке.
Входные данные: имеется принтер Star 650 с интерфейсной платой UCS.
Задача: заставить его печатать без наличия R-Keeper.
Попытки сделать это "легально", через:
- установку родных драйверов Star 650,
- поиска описания протокола на сайте UCS,
- поиска информации на данном форуме
успеха не принесли.
Спасла noname утилитка, которая смогла вывести текст, но только латиницей.
При помощи сниффинга трафика удалось чуть приоткрыть завесу (на это ушло два дня и рулон бумаги).
Данные передаются по протоколу UDP. IP принтер сообщает при включении. Порт по умолчанию 18251.
Любой управляющий пакет должен начинаться с такой последовательности $02,$41,$FF,$21,$01.
Перед командой вывода текста принтеру зачем-то понадобился вот такой пакет $02,$41,$FF,$20. Без него никак
Сама команда вывода текста выглядит так $02,$41,$FF,$21,$00. После неё текст в cp866.
Последовательность для русификации мне удалось найти здесь RK6WIN\RK6\KACCA\STATIONS\DEVICES\PRINTERS\TSP700. RUS
Выглядит она так: $1b, $1d, $74, $0a
Ну и прогон 5 строк+подрезка: $1b, $64, $05, $1d, $56, $01
Между пакетами обязательно нужна пауза. В моём случае стабильной работы удалось добиться при паузе в 100мс.
Эта информация минимально достаточна, чтобы вывести на печать текст без изысков.
Ниже приведена процедура на Delphi, выводящая на печать текстовый файл на русском языке. Код, может и кривой, но вполне рабочий.
Код:
...
udpc: TIdUDPClient;
...
procedure TForm1.PrintTXT(fname: String);
var
s: string;
f: textfile;
i: integer;
sl: TStringList;
countString: Integer;
begin
//Русификация
udpc.Send(#$02+#$41+#$FF+#$21+#$01+#$1b+#$1d+#$74+#$0a);
sleep(100);
//Получаем количество строк текстового файла, чтобы в последней передать команду подрезки
sl := TStringList.Create;
sl.LoadFromFile(fname);
countString := sl.Count;
sl.Free;
//"Дедовский" способ работы с текстовыми файлами
i:=0;
assignfile(f,fname);
reset(f);
repeat
readln(f,s);
inc(i);
//Видимо инциализируем
udpc.Send(#$02+#$41+#$FF+#$20);
sleep(100);
//Или просто выводим строку или выводим и подрезаем
s:=#$02+#$41+#$FF+#$21+#$00+StrAnsiToOem(trim(s));
if i<>countString then s:=s+#10+#13
else s:=s+#$1b+#$64+#$05+#$1d+#$56+#$01;
udpc.Send(s);
sleep(100);
until eof(f);
closefile(f);
end;
Это всё. Надеюсь, что данная информация будет полезна.
Желающим могу выслать исходники или консольную утилиту, которой можно скармливать txt файлы для печати.