Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.10.30;
Скачать: CL | DM;

Вниз

user-defined characters в ESC/P принтерах   Найти похожие ветки 

 
plr   (2011-04-26 23:12) [0]

У кого есть опыт, либо исходники программирования subj с помощью ESC-команд, в частности «ESC &»?

Это создание собственного «начертания» символов через бит-матрицу, знающие люди поймут.

Не могу разобраться как делать, сохранять, загружать, добиваться совместимости с разными принтерами. Поиск не принёс вменяемых исходников.

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


 
Anatoly Podgoretsky ©   (2011-04-27 07:24) [1]

А чем документация то не устраивает?


 
oldman ©   (2011-04-27 09:03) [2]

Я в свое время на матричном делал. Рисовал нужные мне символы.
Хватало информации об ESC-последовательностях из паспорта к принтеру.
Причем, ничего там сохранять\загружать не надо. Посылаешь последовательность на принтер, получаешь нужный результат.


 
Dimka Maslov ©   (2011-04-27 09:55) [3]

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


 
Плохиш ©   (2011-04-27 10:02) [4]


>
> Не могу разобраться как делать, сохранять, загружать, добиваться
> совместимости с разными принтерами. Поиск не принёс вменяемых
> исходников.
>

Так найми программиста.


 
Юрий Зотов ©   (2011-04-27 10:08) [5]


> plr   (26.04.11 23:12)  

Поищите программу KeyRus (была такая во времена DOS). Насколько помню, в ее комплект входили и драйвер Epson-совместимых принтеров, и редактор шрифтов.


> oldman ©   (27.04.11 09:03) [2]
> Причем, ничего там сохранять\загружать не надо. Посылаешь
> последовательность на принтер, получаешь нужный результат.

Это в графическом режиме. Но можно использовать и текстовый, загрузив сначала в принтер нужный шрифт. Так проще.


 
brother ©   (2011-04-27 10:13) [6]

> KeyRus (была такая во времена DOS)

ностальгия!


 
Anatoly Podgoretsky ©   (2011-04-27 10:15) [7]

> Юрий Зотов  (27.04.2011 10:08:05)  [5]

Вы про одно и тоже говорите, что загрузка, что посылка - это одно и тоже.


 
Юрий Зотов ©   (2011-04-27 10:22) [8]


> brother ©   (27.04.11 10:13) [6]

Классная, кстати, была программа. Я когда-то использовал ее для решения нестандартной задачки и для этого пришлось поковыряться в ее потрохах. Так вот - когда я понял, как она работает, то был просто в шоке от того, насколько красиво там все сделано. Не удержался и позвонил Дмитрию только для того, чтобы сказать ему "спасибо". Талантливейший был парень, буквально гений программирования. Жаль только что так рано ушел...

http://yandex.ru/yandsearch?text=%D0%94%D0%BC%D0%B8%D1%82%D1%80%D0%B8%D0%B9+%D0%93%D1%83%D1%80%D1%82%D1%8F%D0%BA&lr=213


 
Юрий Зотов ©   (2011-04-27 10:37) [9]


> Anatoly Podgoretsky ©   (27.04.11 10:15) [7]

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


 
OW ©   (2011-04-27 11:05) [10]


> . Это проще и быстрее.

и смешнее :)
мы так дурачились, меняя в памяти принтера пару букв местами..
ну, это когда на экране такие шутки нам уже надоели
кому то конечно было не смешно, когда потом выяснялось, что вместо о везде а, и наоборот..
В свое оправдание, могу сказать, что мы обычно рядом стояли, и сразу указывали на ошибки..


 
Юрий Зотов ©   (2011-04-27 11:16) [11]


> OW ©   (27.04.11 11:05) [10]

Еще шутка из той же серии: автозагружаемый макрос Word, который вводимый символ "," меняет на строку ", блин,"


 
OW ©   (2011-04-27 11:30) [12]


> Юрий Зотов ©   (27.04.11 11:16) [11]

ага, помню :), только не макрос, а программку для dos и не "блин" там был :)
дал тогда себе слово повторить тоже известную шутку, когда на экране слово Anna заменялось на I love you, Ann! Собственно, тогда и написал шутку с заменой а на о на мониторе, а мой друг - на принтере.
И перед парой, на всех машинах, до которых достал, запустил
а принтер был один на всех, его друг прогрузил

забавно вышло, но не надолго - сразу раскусили..


 
Anatoly Podgoretsky ©   (2011-04-27 11:43) [13]

> Юрий Зотов  (27.04.2011 10:37:09)  [9]

Насколько я понял, он ведет речь про знакогенератор, который можно
программировать, а не про его иммитацию в графическом режиме.


 
Плохиш ©   (2011-04-27 12:01) [14]

Прикольно хвалиться тем, что умеешь посылать esc-последовательность символов в принтер :-))
Ну есть у меня требуемая программа из начала 90-х, 90% кода - отображение интерфейса и 10% непосредственно редактор символов и работа с принтером.


 
OW ©   (2011-04-27 12:15) [15]


> Прикольно хвалиться тем, что умеешь посылать esc-последовательность
> символов в принтер :-))

эт че, еще могу рассказать, как меня карты учили дырявить :)
мало только что получилось из этого, правда


 
brother ©   (2011-04-27 12:22) [16]

> [14] Плохиш ©   (27.04.11 12:01)


> [15] OW ©   (27.04.11 12:15)

эх, я только запись на аудиокассету застал(


 
brother ©   (2011-04-27 12:22) [17]

впрочем, 5 дюймовые дискеты были раньше же?


 
OW ©   (2011-04-27 12:38) [18]


> эх, я только запись на аудиокассету застал(

дык и я не застал - это один пенсионер у нас подрабатывал электронщиком, и у него в подвале стоял агрегат, он его сам и поддерживал в рабочем состоянии


 
OW ©   (2011-04-27 12:52) [19]


> 5 дюймовые дискеты были раньше же?

были
и 8"" были


 
Anatoly Podgoretsky ©   (2011-04-27 12:54) [20]

> brother  (27.04.2011 12:22:17)  [17]

Значит ты 8 дюймовых не застал.


 
brother ©   (2011-04-27 14:08) [21]

> 8 дюймовых не застал

неа, тока на фото)


 
Sha ©   (2011-04-27 23:08) [22]

Больше возможностей в отношении размера и вида символов на матричном принтере дает печать в графическом режиме.
В этом случае ты можешь сам разработать удобный тебе формат файла со шрифтом, который будет использовать твоя программа. Шрифт в принтер грузить не потребуется. Печать выполняется путем перевода строки символов текста в графику в памяти и последующего вывода строки графики на принтер. Имеет смысл сделать отдельную программу для редактирования файла шрифта. Точки графики на экране удобно отображать при помоши символа @.


 
Inovet ©   (2011-04-28 00:31) [23]

> [8] Юрий Зотов ©   (27.04.11 10:22)
> Классная, кстати, была программа

Две версии ходили - одна 12 кБ, вторая 23 кБ. Вот вторая была из комплекта с редактором фонтами и ещё там чем-то.

Вторая до сих пор актуальна для ДОС программ под Вин, её можно настроить так, что шрифт в памяти держится, причём можно чтобы не вся таблица, а только нужные диапазоны, памяти-то мало. А в стандартном русификаторе при смене текстового режима из 25 строк в 80 и-или обратно слетают русские символы. Может и есть какой другой способ, но keyrus.exe решает проблему.


 
Юрий Зотов ©   (2011-04-28 11:50) [24]


> Inovet ©   (28.04.11 00:31) [23]

Главное, чем она хороша - это вот что. У нее куча опций - какие функции включить, какие выключить (причем такого богатого набора функциональности нет, пожалуй, ни в одной аналогичной программе). После запуска она считывает заказанные юзером опции и сама себя пересобирает в памяти так, что резидентными остаются только нужные функции - за счет чего она всегда имеет минимальный размер (у меня она отъедала всего 800 байт, да и те в верхней памяти).

Кроме того, у нее есть и программный интерфейс (через какое-то прерывание, уже не помню номер). Его я тогда и использовал.


 
Inovet ©   (2011-04-28 13:14) [25]

> [24] Юрий Зотов ©   (28.04.11 11:50)
> сама себя пересобирает в памяти так, что резидентными остаются только нужные функции

Я помню, что можно было количество фонтов и символов в них регулировать или вообще отключать драйвер дисплея или клавиатуры. От этого занимаемый объём и зависел, наверно и другие более мелкие неиспользуемые функции тоже исключались. Была там, например, функция определения работает ли уже программа резидентно или нет, чтобы второй раз не оставлять в памяти, но если не надо такое, то несколько десятков байт экономились. Ещё там была визуальная утилита для настройки всего богатства возможностей тех же что и через командную строку. Ещё можно было сохранить прямо в екзешник настройки, чтобы в командной строке не писать кучу опций.


 
plr   (2011-05-01 23:31) [26]

Люди, всё хорошо, всё замечательно, но не могли бы "показать" хотя бы один исходный код определения символов и их печати?


 
Inovet ©   (2011-05-01 23:36) [27]

Да возьми мануал от принтера из тех ещё, там примеры на каждый чих с исходным кодом на Бэйсике и картинкой с результатом.


 
plr   (2011-05-02 00:05) [28]

Inovet, взял документацию из приведённых в ветке ссылок и еще с несколько загруженных - ни в каких нет исходных кодов на бейсике ни на каком другом языке. Я ж не просто так морочу всем голову!


 
Inovet ©   (2011-05-02 00:21) [29]

> [28] plr   (02.05.11 00:05)
> ни в каких нет исходных кодов на бейсике

Я выбросил некоторое время назад несколько мануалов от разных принтеров. Книжки были довольно толстые страниц по 200 в том сисле половина или больше объёма вот этому отведена. Думаю есть такие в сети. Ну вот что-то с ходу
http://support.epson.ru/manual_list.asp?product=53


 
Sha ©   (2011-05-02 00:33) [30]

Одна из моих первых программ на TurboPascal"e - редактирование шрифта для печати текстов на матричном принтере в графическом режиме с произвольным межстрочным интервалом. Позволяет готовить шрифты от самых крупных (максимально похожих на пишущую машинку) до почти микроскопических.

program sheimged; (* редактирование шрифта  *.img  *)
uses
 crt;
const
 mdx = 24;  (* гоpизонтальный pазмеp матpицы шpифта *)
 mdy = 24;  (* веpтикальный   pазмеp матpицы шpифта *)
 imabnd = 3;
 title : string = "";   (* имя файла со шpифтом *)
type
 imatype = array[1..imabnd] of array[1..mdx] of byte; (* символ *)
var
 fontfile : file;   (* файл, в котоpом хpанится шpифт *)
 font : array[0..255] of imatype;
 len  : array[0..255] of byte;
 ima  : imatype;
 pix  : array[1..mdy] of string[mdx];  (* pисунок на экpане *)

procedure pressesc;
var
 fic : char;
begin;
 gotoxy(1,25);
 textattr:=4*16+15;     write(" нажмите ");
 textattr:=128+4*16+15; write("ESC ");
 repeat; fic:=readkey; if fic=#0 then readkey; until fic=#27;
 gotoxy(1,25);
 textattr:=4*16+15;     write("             ");
end;

function answer(x,y : integer; question : string) : boolean;
var
 fic : char;
begin;
 gotoxy(x,y);
 textattr:=4*16+15;     write(question);
 textattr:=128+4*16+15; write("   (ENTER/ESC) ");
 repeat;
   fic:=readkey;
   if fic=#13 then answer:=true
   else if fic=#27 then answer:=false
   else begin; if fic=#0 then readkey; fic:=#0; end;
   until (fic<>#0);
 gotoxy(x+length(question)+1,y);
 textattr:=4*16+15;     write("               ");
 gotoxy(x+length(question)+1,y);
end;

procedure readfile;  (* чтение шpифта из файла *)
var
 i, j, k: integer;
 no: word;
begin;
 fillchar(font,sizeof(font),#0);
 clrscr;
 gotoxy(10,2); textattr:=4*16+15;
 write(" введите имя файла для хpанения шpифта -> "); readln(title);
 gotoxy(30,10); write(" загрузка ... ");
 if (length(title)=0) or (title[1]=" ") then halt(1000);
 assign(fontfile,title);
 {$I-} reset(fontfile,1); {$I+}
 if ioresult=0 then begin;
   if filesize(fontfile)=16128
     then blockread(fontfile,font[ord(" ")],224*sizeof(imatype),no);
   close(fontfile);
   end;
 end;

procedure editsym;
var
 x, y, dx, dy, dyt : integer;
 sym,  symold: char;             (* pедактиpуемый символ *)
 unspec : byte;                  (* вес символа *)
 w      : array [1..8] of byte;  (* веса битов: 128,64,...,2,1 *)
 ch: char;
 i, j, k, l, j1, j2: integer;
label
 redraw, reread, define_sym, ret;
begin;
 w[8]:=1; for i:=7 downto 1 do w[i]:=w[i+1]*2;
 symold:=" ";
define_sym:                 (* pедактиpование нового символа *)
 repeat;
   textattr:=3*16+15; clrscr;
   write(" введите пеpеопpеделяемый символ или ESC ");
   sym:=readkey;
   if sym=#27 then goto ret;
   if sym=#0 then begin; sym:=readkey;
     if sym=#67 then sym:=pred(symold)
     else if (sym=#68) and (symold<#255) then sym:=succ(symold)
     else sym:=" ";
     end;
   if sym<" " then sym:=" ";
   until(sym<>" ");
 symold:=sym;
 textattr:=3*16+15;
 clrscr;
 gotoxy(1,25);  write(" символ ");
 textattr:=1*16+15; write(" ",sym," ");
 gotoxy(75,25);     write(" ",ord(sym)," ");
 gotoxy(15,25);
 textattr:=4*16+15; write(" ESC - отмена   ",
                   "ПРОБЕЛ/СТРЕЛКИ - pисунок   ",
                   "ENTER-> конец ");

 ima:=font[ord(sym)];
 for dx:=1 to mdx do for dy:=1 to mdy do pix[dy,dx]:=".";
 for dx:=1 to mdx do begin;
   unspec:=ord(ima[1,dx]);
   for dy:=1 to 8 do if unspec>=w[dy] then begin;
     unspec:=unspec-w[dy];
     pix[dy+dy-1,dx]:="@";
     end;
   end;
 for dx:=1 to mdx do begin;
   unspec:=ord(ima[2,dx]);
   for dy:=1 to 8 do if unspec>=w[dy] then begin;
     unspec:=unspec-w[dy];
     pix[dy+dy,dx]:="@";
     end;
   end;
 for dx:=1 to mdx do begin;
   unspec:=ord(ima[3,dx]);
   for dy:=1 to 8 do if unspec>=w[dy] then begin;
     unspec:=unspec-w[dy];
     if dy<5 then pix[dy+dy+15,dx]:="@"
             else pix[dy+dy+8,dx] :="@";
     end;
   end;
 for dy:=1 to mdy do pix[dy,0]:=chr(mdx); (* длина стpоки *)

 x:=30; y:=0;
 dx:=1; dy:=1;
 textattr:=3*16+15;
 gotoxy(x-4,03); write("....."); gotoxy(x+1+mdx,03); write(".....");
 gotoxy(x-4,07); write("....."); gotoxy(x+1+mdx,07); write(".....");
 gotoxy(x-4,11); write("....."); gotoxy(x+1+mdx,11); write(".....");
 gotoxy(x-4,20); write("....."); gotoxy(x+1+mdx,20); write(".....");

redraw:                               (* пеpеpисовка матpицы *)
 textattr:=1*16+15;
 for dyt:=1 to mdy do begin;
   gotoxy(x+1,y+dyt);
   write(pix[dyt]);
   end;

reread:              (* чтение указания на изменение матpицы *)
 textattr:=3*16+15;
 gotoxy(10,3);  write(dx:2,dy:4);
 gotoxy(65,20); write(mdx+1-dx:2,mdy+1-dy:4);

 gotoxy(x+dx,y+dy);
 ch:=readkey;
 if ch=#27 then goto define_sym;      (* отказ от изменения *)
 if ch=" " then begin;                     (* инвеpсия иглы *)
   if pix[dy,dx]="." then begin;
     pix[dy,dx]:="@";
     if dx>1 then pix[dy,dx-1]:=".";
     if dx<mdx then pix[dy,dx+1]:=".";
     goto redraw;
     end
   else begin;
     pix[dy,dx]:=".";
     goto redraw;
     end;
   end;
 if ch=#0 then begin;              (* пеpеход к дpугой игле *)
   ch:=readkey;
   if ch=#66 then begin;                                    {F8}
     for dyt:=1 to mdy do fillchar(pix[dyt,1],mdx,".");
     goto redraw;
     end;
   if ch=#71 then begin; dy:=dy-1; dx:=dx-1; end;
   if ch=#72 then        dy:=dy-1;
   if ch=#73 then begin; dy:=dy-1; dx:=dx+1; end;
   if ch=#75 then                  dx:=dx-1;
   if ch=#77 then                  dx:=dx+1;
   if ch=#79 then begin; dy:=dy+1; dx:=dx-1; end;
   if ch=#80 then        dy:=dy+1;
   if ch=#81 then begin; dy:=dy+1; dx:=dx+1; end;
(*  if dy<=0 then dy:=1; if dy>mdy then dy:=mdy;  *)
(*  if dx<=0 then dx:=1; if dx>mdx then dx:=mdx;  *)
   dy:=(dy+mdy-1) mod mdy +1;
   dx:=(dx+mdx-1) mod mdx +1;
   goto reread;
   end;
 if ch<>#13 then goto reread;   (* пpодолжим pедактиpование *)

 l:=0;   (* последняя колонка *)
 fillchar(ima,sizeof(ima),#0);
 for dx:=1 to mdx do begin;
   for dy:=1 to mdy do begin;
     if pix[dy,dx]="@" then begin;
       l:=dx;
       j1:=(dy+1) mod 2;
       if dy<=16 then j2:=1 else j2:=3-j1;
       if dy<=16 then k:=(dy+1) div 2 else k:=((dy-15) div 2)+4*j1;
       inc(ima[j1+j2,dx],w[k]);
end;
     end;
   end;
 inc(l,2); if l<16 then l:=16; if l>24 then l:=24;
 len[ord(sym)]:=l;
 font[ord(sym)]:=ima;

 goto define_sym;
ret:
 end;

procedure writefile;
var
 i, j, k: integer;
 no: word;
begin;
 rewrite(fontfile,1);
 blockwrite(fontfile,font[ord(" ")],224*sizeof(imatype),no);
 close(fontfile);
 textattr:=0*16+15; writeln(" шpифт сохpанен ");
 pressesc;
 end;

begin;
 readfile;
 editsym;
 clrscr;
 writeln("          pедактиpование окончено");
 if answer(10,3," сохpанить шpифт ? ") then writefile;
 textattr:=0*16+15;
 clrscr;
 end.


 
Inovet ©   (2011-05-02 00:56) [31]

А какой тут код. Тебе надо вывести на принтер управляющие символы точно так же как обычный текст.
Хоть в FARе или в Hex-редаторе открывай текстовый файл и пиши в него последовательность и текст для проверки. Потом
copy file.txt prn
и проверяй результат.


 
plr   (2011-05-02 01:18) [32]

Вывожу код - символы не переопределяются. Печатаются в старом виде. Документации к моему принтеру (Posiflex PP7000) не нашёл, хотя он ESC/p совместимый. По документации к других принтерам вижу разницу в применении ESC & - команды переопределения символов.

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


 
Inovet ©   (2011-05-02 01:32) [33]

\Всю главу прочитал Defining user-defined characters со стр R-17?


 
plr   (2011-05-02 01:37) [34]

Конечно, пробовал различные варианты - не переопределяет начертания символов на моём принтере. Понятно, что я делаю, что-то не так, но что?


 
Германн ©   (2011-05-02 03:17) [35]


> plr   (02.05.11 01:37) [34]
>
> Конечно, пробовал различные варианты

Ты долго просил "варианты".
Пора привести свой код, который неправильно работает.


 
Anatoly Podgoretsky ©   (2011-05-02 07:28) [36]

> plr  (01.05.2011 23:31:26)  [26]

А в разных принтерах это по разному.


 
Sha ©   (2011-05-02 09:39) [37]

> plr   (02.05.11 01:18) [32]

Чтобы принтер позволял переопределять поьзователю символы, он должен быть не только ESC/p совместимым, но и иметь предназначенную для этого установленную память.

Память может быть опцией.


 
Sha ©   (2011-05-02 10:27) [38]

Хотя это очевидно, но все же спрошу.
После загрузки шрифта в принтер, на свой шрифт переключаешься? Команду посылаешь?


 
Sha ©   (2011-05-02 10:39) [39]

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

Отловить подобное можно при помощи перевода принтера в режим дампа. В этом режиме ты также можешь посмотреть, что посылают на принтер другие программы.


 
Anatoly Podgoretsky ©   (2011-05-02 10:48) [40]

> Sha  (02.05.2011 10:27:38)  [38]

В приведеном руководстве приведена последовательноть команд, как по
программированию, так и по выбору шрифта.


 
Sha ©   (2011-05-02 11:22) [41]

> Anatoly Podgoretsky ©   (02.05.11 10:48) [40]

Ну, я типа в курсе. Не факт, что ТС ее юзает.
По крайней мере из его слов это не следует.


 
Anatoly Podgoretsky ©   (2011-05-02 11:34) [42]

Я не уверен, что он прочитал руководство.


 
Inovet ©   (2011-06-02 13:31) [43]

Нашёл у себя книжку от Epson LX-1050+, не выбросил значит. В ней есть программы на Basic по сабжу. Одна аж 23 строки, другая 25, и в книжке много картинок. Надо?


 
plr   (2011-07-06 18:48) [44]

Парни, всем спасибо, я всё осилил, что хотел, всё получилось.

Если кратко, то:

1. ESC/P - стандарт, но от принтера к принтеру есть расхождения или расширения.

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

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

Если кому нужны будут подробности - обращайтесь, подскажу.



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

Текущий архив: 2011.10.30;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.012 c
15-1309811398
Юрий
2011-07-05 00:29
2011.10.30
С днем рождения ! 5 июля 2011 вторник


15-1309877734
oleg1963lora
2011-07-05 18:55
2011.10.30
Как назвать UltraISO, Daemon и т.д. общим словом?


15-1309440076
SQLEXPRESS
2011-06-30 17:21
2011.10.30
Сортировка


2-1310440871
R_R
2011-07-12 07:21
2011.10.30
"Asynchronous socket error 10060"


1-1269854003
EgorovAlex
2010-03-29 13:13
2011.10.30
Форма в dll. Пытаюсь разобраться