LINUX.ORG.RU

Использование принтера в режиме телетайпа-телеграммной ленты.

 ,


2

2

Купил под восстановление матричный usb принтер EPSON LX-300+. (кстати а есть ли под него нормальный драйвер в линукс? Я нашёл только стандартный Epson 9-Pin Series)

Фото жужжалки https://i.postimg.cc/13hTySMh/IMG-6074.jpg

Цели - печать этикеток для кассет с играми ZX-Spectrum, просто всяких этикеток на кассеты с музыкой, и вообще заметок чудесным матричным шрифтом из точек. В общем для фана и не только.

В linux в консоли тоже нашёл применение, хочу отправлять на него однострочные заметки из терминала.

Казалось бы, всё просто:

a="Message to print"; echo $a | lpr


но после печати даже одной строки принтер прокручивает весь лист, что в принципе логично, но мне вовсе не надо. Мне надо как это было на рулонных принтерах докинескопной эры, напечатать строку, перевести каретку, и ждать строкой ниже следующей печати.

Как это можно сделать?

Я не хочу заранее составлять листы документов и печатать их, это сломает весь кайф, я хочу периодически отправлять на принтер отдельные строки, чтобы они заполняли один лист. Возможно я буду делать это по сети, и у меня не будет возможности менять бумагу, возможно я так буду смски принимать, почему бы и нет?). Про вариант питания от рулона я знаю, пока про него не будем, пока под рукой только бумага А4 и я хочу выжать эту ф-цию на ней.

★★★

Последнее исправление: hikikomori (всего исправлений: 1)

Ответ на: комментарий от post-factum

Я первым делом так попробовал, но «Нет такого файла или каталога».

ls /dev/
autofs block bsg btrfs-control bus char console core cpu cpu_dma_latency cuse disk dri drm_dp_aux0 drm_dp_aux1 fb0 fd full fuse hidraw0 hidraw1 hidraw2 hpet hugepages input kmsg kvm lightnvm log loop-control mapper md md0 mei0 mem memory_bandwidth mqueue net network_latency network_throughput null port ppp psaux ptmx pts random rfkill rtc rtc0 sda sda1 sdb sdb1 sdc sdd sdd1 sde sdf sdg sdh sdh1 sdi sdi1 sdi2 sdi3 sdi4 sdi5 sdj sdj1 sdk sdk1 sdl sdl1 shm snapshot snd stderr stdin stdout tty tty0 tty1 tty10 tty11 tty12 tty13 tty14 tty15 tty16 tty17 tty18 tty19 tty2 tty20 tty21 tty22 tty23 tty24 tty25 tty26 tty27 tty28 tty29 tty3 tty30 tty31 tty32 tty33 tty34 tty35 tty36 tty37 tty38 tty39 tty4 tty40 tty41 tty42 tty43 tty44 tty45 tty46 tty47 tty48 tty49 tty5 tty50 tty51 tty52 tty53 tty54 tty55 tty56 tty57 tty58 tty59 tty6 tty60 tty61 tty62 tty63 tty7 tty8 tty9 ttyS0 ttyS1 ttyS2 ttyS3 uhid uinput urandom userio vcs vcs1 vcs2 vcs3 vcs4 vcs5 vcs6 vcsa vcsa1 vcsa2 vcsa3 vcsa4 vcsa5 vcsa6 vcsu vcsu1 vcsu2 vcsu3 vcsu4 vcsu5 vcsu6 vfio vga_arbiter vhci vhost-net vhost-vsock watchdog watchdog0 zero

hikikomori ★★★
() автор топика
Ответ на: комментарий от Zubok

Вот большое спасибо! А я-то искал на офф сайте...

hikikomori ★★★
() автор топика
Ответ на: комментарий от hikikomori

лезть менять придётся

Куда лезть? По ссылке есть параметры командной строки для купсового lpr.

anonymous
()
Ответ на: комментарий от anonymous

Я пробовал так, но всё равно после печали лист прогоняет:

a="HELLO LOR!"; echo $a | lpr -o media=Custom.40x1

hikikomori ★★★
() автор топика

Может просто копировать на порт необходимые данные в текстовом виде (возможно с включением в текст управляющих последовательностей, если в этом есть необходимость)?

Bootmen ☆☆☆
()

Это надо /etc/printcap ковырять. В частности

fo  D   bool false       print a form feed when device is opened
fq  D   bool false       print a form feed when device is closed

И т.п.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 2)
Ответ на: комментарий от Bootmen

Как, через пайп в какой-то dev? А как понять какой у него порт? Я уже даже не знаю. Физически: $ lsusb | grep Epson [br]Bus 001 Device 017: ID 04b8:0005 Seiko Epson Corp. Printer

hikikomori ★★★
() автор топика
Ответ на: комментарий от no-such-file

У меня там почти пусто. Я не очень понял структуру вашей цитаты, что с fo D bool false делать?

$ cat /etc/printcap
# This file was automatically generated by cupsd(8) from the
# /etc/cups/printers.conf file.  All changes to this file
# will be lost.
epson-lx-300p|EPSON LX-300+:rm=host:rp=epson-lx-300p:

hikikomori ★★★
() автор топика
Ответ на: комментарий от post-factum

Я приводил выше свой вывод ls /dev/*
Он не изменился.

hikikomori ★★★
() автор топика
Ответ на: комментарий от anonymous

Там простыня трёпа на инглише..
Из сути выцепил только:
lpr -P epson-lx-300p -o PageSize=Custom.5x7in ~/test

Он его в отличии от a="HELLO LOR!"; echo $a | lprcc даже не печает, просто прогоняет лист.

hikikomori ★★★
() автор топика

Про вариант питания от рулона я знаю

А рулон тоже несильно поможет, даже на рулоне принтер по умолчанию будет делать пропуски для нарезания рулона на листы.

Надо курить язык управления принтерами Эпсон - https://epson.ru/upload/support/library/esc-p.pdf
Там можно поиграться с настройками формата страницы (размер страницы в строках, отступы сверху и снизу, межстрочный интервал, реакция на датчик конца бумаги, скорость печати и т.п.)

Правда, когда я более 10 лет назад сражался с матричным принтером за экономию бумаги - принтер был на интерфейсе cetronics

sigurd ★★★★★
()
Ответ на: комментарий от sigurd

Спасибо за ссылку. Огромадный мануал, полистал, но как эти команды ему передавать? В простом печатаемом тексте через эскейп-последовательности? Только где гарантия, что после выполнения всё равно не прокатит лист)

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

hikikomori ★★★
() автор топика
Последнее исправление: hikikomori (всего исправлений: 1)
Ответ на: комментарий от sigurd

Меня уже так и подмывает приколоться на принтером, и либо лист в петлю склеить, либо из длиной полосы склеить ему петлю Мёбиуса. Пусть проматывает до посинения, sonofabitchсукин он сын.

hikikomori ★★★
() автор топика
Ответ на: комментарий от i-rinat

Ну вот, а ларчик просто открывался... Мы маг и волшебник, спасибо)

man lpr:

-l   Specifies  that  the print file is already formatted for the destination and should be sent without filtering.  This option is
            equivalent to -o raw.


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

А так же не предполагает печати рускими буквами, только латиница уменьшенного размера. =) Я ещё не вкурил мануал по ссылке уважаемого sigurd, подскажите плиз, как ему указать русский шрифт стандартного размера?

Матричный принтер это такой секс... Последний раз ночью, чтобы не слышали соседи, я прикрывал подушкой не кричащий принтер... ))

hikikomori ★★★
() автор топика
Ответ на: комментарий от hikikomori

А могли бы пояснить, что already formatted не предполагает прокрутки листа после задачи.

Сырой режим ещё много чего не предполагает. Перечисление всего займёт очень много страниц.

Но вообще да. Нужно знать, что принтер перематывает страницу при попытке печати байта 0x0c. Дальше проще.

А так же не предполагает печати рускими буквами, только латиница уменьшенного размера.

Шрифт зашит в принтер. И если принтер не предназначался изначально для России, русских букв там может и не быть. Если они всё же есть, то наверняка в кодировке cp866, которая была де-факто стандартом под MS-DOS. А ты наверняка шлёшь как есть, в UTF-8.

Если букв всё же нет, придётся тебе городить свой фильтр для преобразования букв в растр.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Я уже во всю развлекаюсь, результат радует)

https://i.postimg.cc/JzFQkkZ2/IMG-6096.jpg

for x in "Wake up, User", "The Windows has you...", "follow the GNU/Linux", "Knock, knock, User...";do sleep 2 && echo $x | lpr -l;done




Должны быть русские буквы, самая последняя ходовая модель же. И просто так не в raw русскими печатает нормально.

А ты наверняка шлёшь как есть, в UTF-8.

Разумеется, я же через консоль. Но я пробовал указывать кодировку:

a="ПРИВЕТ! привет!"; echo $a | iconv -f CP866 | lpr -o raw

Результат на фото:
https://i.postimg.cc/wv4xqgSL/IMG-6100.jpg

Пробовал 1251, ошибка:
$ a="ПРИВЕТ! привет!"; echo $a | iconv -f CP1251 | lpr -o raw
iconv: недопустимая входная последовательность в позиции 5

hikikomori ★★★
() автор топика
Ответ на: комментарий от anonymous

Я пробовал a="И"; echo $a | iconv -f CP1251 [br]Рiconv: недопустимая входная последовательность в позиции 1
Спасибо, смена ключа помогла. Русские буквы достигнуты.

man iconv:

 -f from-encoding, --from-code=from-encoding
              Use from-encoding for input characters.
-t to-encoding, --to-code=to-encoding

А решение с iconv достаточно правильное и изящное? Может можно сделать ещё проще?

Осталось вспомнить, как в баше экранируются ESC последовательности и коды вообще, и какую послать команду принтеру чтобы изменить размер букав)

hikikomori ★★★
() автор топика
Последнее исправление: hikikomori (всего исправлений: 1)
Ответ на: комментарий от anonymous
       -c     Silently discard characters that cannot be converted instead of terminating when encountering such characters.



Спасибо.


Продолжаю мучать мануал Язык управления принтерами Эпсон - https://epson.ru/upload/support/library/esc-p.pdf

Там ещё оглавление дурацкое. Ссылается не на номер страницы, а например на R42, и ищи его, пока не найдёшь на 276 стр.
А там 428 страниц на минуточку...

Как передать принтеру последовательность, чтобы печатал нормальным размером, но в один проход самыми простыми точками - всё ещё пока ищу...
Если гуру подскажут, сэкономленное время посплю в уходящем году и со свещими силами вгрызусь в мануал) А пока хочется вот прямо сразу распечатать, и на примере вкуривать дальше.

hikikomori ★★★
() автор топика
Ответ на: комментарий от anonymous

Выше любой гляньте, я же кидал.


Пока пробую что-то вроде echo -e "\027\040\067..." но хрен поймёшь по этому мануалу, что именно ему подать. Не могу уловить суть, там либо нет примеров, либо я их найду где-то в зажопинске мануала, когда уже без него обойдусь.

hikikomori ★★★
() автор топика
Ответ на: комментарий от anonymous

А что вы хотите увидеть? Печатать русскими буквами я уже научился, хочу изменить размер шрифта на обычный, как при печати без -l. Для этого нужно указать принтеру ESC/P, но как и какие не очень понимаю, инструкция традиционно написана так, что пока от корки до корки эту войну и мир не прочитаешь, ничего не поймёшь. гуглить пробовал, дебри...

Уже угуглился... Читаю https://ru.wikipedia.org/wiki/ESC/P и там ссылка на ранее указанную мне инструкцию Epson Escape/P 2 Reference Manual. Всё, круг замкнулся, зациклился)

Последняя неудачная попытка:

a="test"; echo -e "\027\033"4$a | lpr -o raw

Печатает test а перед ним квадратик мелкий.
А должен начать печатать шрифтом italic.

a="TEST"; echo -e "\027\120\48"$a | lpr -o raw
\027 обрабатывает, а остальные цифры печатает как текст.


Вот ещё нашёл: Epson FX Printer Codes http://lprng.sourceforge.net/DISTRIB/RESOURCES/PPD/epson.htm

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

hikikomori ★★★
() автор топика
Последнее исправление: hikikomori (всего исправлений: 3)
Ответ на: комментарий от anonymous

Тонко!

хочу изменить размер шрифта на обычный, как при печати без -l.

hikikomori ★★★
() автор топика
Ответ на: комментарий от hikikomori

Последняя неудачная попытка: a=«test»; echo -e "\027\033"4$a | lpr -o raw

Изменить стиль: 27 33 nn (nn - битовая маска) = «\e!\x00»

echo -e "\e!\x04 test" | lpr -о raw
sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 2)
Ответ на: комментарий от i-rinat

Так целиком как дать принтеру команду изменить шрифт? Не получилось. Либо не исполняет, либо печатает код на бумаге.

(q) — не получается. — не поддаётся (с) Джек Уолтерс

Я перепробовал кучу вариантов, но в том дурацком мануале куда-то в зажопинск запрятаны примеры, либо их нет. Я так понимаю, что эскейпы для принтера похожи на ANSI коды. Вот применение на питоне:

print('\033[1;31mЭтот текст красный,\033[1;33mэтот желтый,\033[0m а этот по умолчанию')


Я просто что-то не догоняю по синтаксису epson.

hikikomori ★★★
() автор топика
Последнее исправление: hikikomori (всего исправлений: 1)
Ответ на: комментарий от hikikomori

Выше же писали уже. Вот так попробуй:

echo -e "\e\x21\x04test" | lpr -l

Просто у восклицательного знака в bash особое значение, и он некоторые комбинации пытается его развернуть.

эскейпы для принтера похожи на ANSI коды

В смысле, начинаются на ESC? Ну да, их поэтому и называют Escape-последовательностями.

i-rinat ★★★★★
()
Ответ на: комментарий от hikikomori

Потому что \x04 это Condensed. Поставь туда, например, \x81. Должно включить шрифт нормальной ширины, но с подчёркиванием букв.

Да и вообще, экспериментируй. Коды ты уже нагуглил.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

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

Я выполняю 21:
echo -e "\e\x21\x81test" | lpr -l

В инструкции только про 27:
27 81 n ESC Q n Set right margin (n=column)

Как после этого читать инструкцию, если там нет этого кода? Ну не может такого быть, я искал по ^f.

hikikomori ★★★
() автор топика
Ответ на: комментарий от hikikomori

Я выполняю 21: echo -e «\e\x21\x81test» | lpr -l

Это именно код из краткой сводки команд: 27 33 n
27 = «\x1b» = «\033» = «\e»
33 = «\x21» = «!» (но баш перехватывает символ !)
\x81 - это битовая маска, описанная в мануале, где каждый бит включает или выключает определенное свойство шрифта.
Переводи все в шестнадцатеричный код:

echo -e "\x1b\x21\x81" | lpr -l
sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.