Форум: "Прочее";
Текущий архив: 2011.10.30;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.6 MB
Время: 0.006 c