Jump to content

    

Программирование принтера

Есть такая задача - надо управлять принтером (довольно старым матричным Epson FX-1000)

 

по средствам параллельного порта, используя толь ко базовый адрес LPT порта и два его

 

регистра (к примеру - 378h, 379h и 37Ah). Можно ли это сделать вообще, и если да, то как

 

(я пробовал отправлять на 378h бит информации, потом выставлять регистр и строб данных

 

на 37Ah, примерно так же, как и при работе с ЖК индикатором, но принтер символ не

 

печатал).

Share this post


Link to post
Share on other sites
Есть такая задача - надо управлять принтером (довольно старым матричным Epson FX-1000)

 

по средствам параллельного порта, используя толь ко базовый адрес LPT порта и два его

 

регистра (к примеру - 378h, 379h и 37Ah). Можно ли это сделать вообще, и если да, то как

 

(я пробовал отправлять на 378h бит информации, потом выставлять регистр и строб данных

 

на 37Ah, примерно так же, как и при работе с ЖК индикатором, но принтер символ не

 

печатал).

 

Насколько я помню матричные принтеры печатают только строку, то есть чтобы принтер что-то напечатал, на него надо послать код CR+LF. Принтер легко управляется непосредственным обращением к регистрам. В принципе посмотреть на это можно дезасемблировав ДОСовское (точнее BIOS - то есто "живет" в ПЗУ материнской платы) прерывание 17Н (вывод символа на принтер)

Share this post


Link to post
Share on other sites

Не могли бы вы объяснить по подробнее, что значит "послать код CR+LF".

Share this post


Link to post
Share on other sites
Не могли бы вы объяснить по подробнее, что значит "послать код CR+LF".

 

Послать на принтер символ с кодом 0dH, а потом 0aH тем же способом, как Вы посылаете на него остальные символы.

Share this post


Link to post
Share on other sites

Достаточно ли команды типа outport(378h,data_byte); (в старом С++), или на до еще отправлять данные на служебные регистры?

 

С комбинацией типа:

int control=lpt+2;

void wd(int data)

{

outport(control,0x07);

delay(10);

outport(lpt,data);

delay(10);

outport(control,0x06);

delay(10);

outport(control,0x07);

delay(10);

outport(control,0x05);

delay(10);

}

 

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

Share this post


Link to post
Share on other sites
outport(control,0x05);

delay(10);

}

 

 

Во-первых ноги разъема 1(STROBE), 14(CRLF), 17(SELECT) - инвертированые, то есть когда туда пишется 1 на выходе будет 0. Нога 16 (INIT)- неинвертированая.

Во-вторых дергать ногу CRLF не надо! Она не имеет никакого отношения к посылке СИМВОЛОВ CR+LF на принтер.

 

Поэтому

 

void outLPT(char data) {

 

char by=0xC;

outport(control,by);

outport(lpt,data);

by|=1;

outport(control,by);

by&=0xFE;

outport(control,by);

}

 

outLPT(data);

outLPT(0xD); // по этой команде идет печать и возврат каретки

outLPT(0xA); // переход на новую строку

 

 

Ширина строба - не менее 0.5 мкс, поэтому delay(10) - 10 мс - это слишком

Share this post


Link to post
Share on other sites

Я разобрался, как надо управлять принтером, пробовал запускать эту программу, экспериментировал сней, но ПРИНТЕР ВСЕ РАВНО НЕ ПЕЧАТАЕТ! Возможно ли, что проблема - во взаимодействии сревы BC 3.1 с WIN XP SP1 ? Может винда как - нибудь блокирует порты при обращении к ним? Хотя печать, запущенная из самого BC 3.1 работает без проблем. В чем может быть ошибка? Пии считывании регистра состояния, принтер выдает "DF", что значит - в нем ошибка, принтер на линии, бумага есть, принтер готов и не занят. Хотя в это время бумага есть и он не готов.

Share this post


Link to post
Share on other sites

Под XP/W2k и подобными прямое обращений к портам закрыто системой!!! Без дряйвера ядра Вы НИКОГДА не сможете работать с принтерным портом. Существует довольно много программ, которые открывают доступ к портам пользовательским приложениям. Здесь где-то на форуме пролетала такая программа http://forum.electronix.ru/index.php?showt...st=entry17577

Правда она вряд ли будет работать с досовским придожением. Поищите на просторах Интернета соответствующие примочки.

Share this post


Link to post
Share on other sites

Нашел у себя прогу, которая позволяет досовским приложенияс работать с LPT в XP/W2k/NT4. Я ее в свое время использовал с программатором, под который не было Win программы

 

[Файл удален]

Share this post


Link to post
Share on other sites

Огромное спасибо - прнтер начал печатвть. Для этого пришлось создать загрузочный CD с DOS и работать через него. Осталось такое впечатление: WinXP - suxx, намного удобнее использовать 98 [iMHO]. В вышеприведенном алгоритмe оказалась неточность: Принтер печатает буфер не на 0хD, a на 0х8, на 7 он издает зв. сигнал, на С - перевод каретки и перемотка страницы, на 0х12 переходит в режим печати уплотненным шрифтом. Огромное спасибо за помощь. Без вас бы еще долго бы парился с этой задачей. Еще один вопрос - скрыт ли доступ в WIN XP к LPT для MatLAB 6.5, конкретно - для RealTime Windows Target библиотеки из Simulink?

Share this post


Link to post
Share on other sites

Еще один вопрос - какая нока на принтерном разъеме centronics отвечает за выбор регистра 378 или 37а?

Share this post


Link to post
Share on other sites
Еще один вопрос - какая нока на принтерном разъеме centronics отвечает за выбор регистра 378 или 37а?

 

То есть? Никакие ноги за выбор *регистра* не отвечают. 378 - это регистр данных (ноги D0-D7), 37A - это управляющий регистр - то есть выходные ноги служебных линий

Share this post


Link to post
Share on other sites

Простите, пост был написан впопыхах и с дурной головой.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this