реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Программирование принтера
tangar
сообщение May 8 2005, 07:58
Сообщение #1





Группа: Новичок
Сообщений: 10
Регистрация: 12-03-05
Пользователь №: 3 297



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

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

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

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

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

печатал).
Go to the top of the page
 
+Quote Post
vvs157
сообщение May 8 2005, 11:59
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(tangar @ May 8 2005, 10:58)
Есть такая задача - надо управлять принтером (довольно старым матричным Epson FX-1000)

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

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

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

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

печатал).
*


Насколько я помню матричные принтеры печатают только строку, то есть чтобы принтер что-то напечатал, на него надо послать код CR+LF. Принтер легко управляется непосредственным обращением к регистрам. В принципе посмотреть на это можно дезасемблировав ДОСовское (точнее BIOS - то есто "живет" в ПЗУ материнской платы) прерывание 17Н (вывод символа на принтер)
Go to the top of the page
 
+Quote Post
tangar
сообщение May 9 2005, 07:28
Сообщение #3





Группа: Новичок
Сообщений: 10
Регистрация: 12-03-05
Пользователь №: 3 297



Не могли бы вы объяснить по подробнее, что значит "послать код CR+LF".
Go to the top of the page
 
+Quote Post
vvs157
сообщение May 9 2005, 11:22
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(tangar @ May 9 2005, 10:28)
Не могли бы вы объяснить по подробнее, что значит "послать код CR+LF".
*


Послать на принтер символ с кодом 0dH, а потом 0aH тем же способом, как Вы посылаете на него остальные символы.
Go to the top of the page
 
+Quote Post
tangar
сообщение May 9 2005, 19:47
Сообщение #5





Группа: Новичок
Сообщений: 10
Регистрация: 12-03-05
Пользователь №: 3 297



Достаточно ли команды типа 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);
}

принтер ничего не печатает и даже отказывается переходить в состояние готовности. (После отключения от компа - готов тут же.)
Go to the top of the page
 
+Quote Post
vvs157
сообщение May 9 2005, 22:22
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(tangar @ May 9 2005, 22:47)
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 мс - это слишком
Go to the top of the page
 
+Quote Post
tangar
сообщение May 12 2005, 15:57
Сообщение #7





Группа: Новичок
Сообщений: 10
Регистрация: 12-03-05
Пользователь №: 3 297



Я разобрался, как надо управлять принтером, пробовал запускать эту программу, экспериментировал сней, но ПРИНТЕР ВСЕ РАВНО НЕ ПЕЧАТАЕТ! Возможно ли, что проблема - во взаимодействии сревы BC 3.1 с WIN XP SP1 ? Может винда как - нибудь блокирует порты при обращении к ним? Хотя печать, запущенная из самого BC 3.1 работает без проблем. В чем может быть ошибка? Пии считывании регистра состояния, принтер выдает "DF", что значит - в нем ошибка, принтер на линии, бумага есть, принтер готов и не занят. Хотя в это время бумага есть и он не готов.
Go to the top of the page
 
+Quote Post
vvs157
сообщение May 12 2005, 16:11
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Под XP/W2k и подобными прямое обращений к портам закрыто системой!!! Без дряйвера ядра Вы НИКОГДА не сможете работать с принтерным портом. Существует довольно много программ, которые открывают доступ к портам пользовательским приложениям. Здесь где-то на форуме пролетала такая программа http://forum.electronix.ru/index.php?showt...st=&#entry17577
Правда она вряд ли будет работать с досовским придожением. Поищите на просторах Интернета соответствующие примочки.
Go to the top of the page
 
+Quote Post
vvs157
сообщение May 12 2005, 19:33
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



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

[Файл удален]
Go to the top of the page
 
+Quote Post
tangar
сообщение May 13 2005, 17:44
Сообщение #10





Группа: Новичок
Сообщений: 10
Регистрация: 12-03-05
Пользователь №: 3 297



Огромное спасибо - прнтер начал печатвть. Для этого пришлось создать загрузочный 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?
Go to the top of the page
 
+Quote Post
tangar
сообщение May 18 2005, 12:23
Сообщение #11





Группа: Новичок
Сообщений: 10
Регистрация: 12-03-05
Пользователь №: 3 297



Еще один вопрос - какая нока на принтерном разъеме centronics отвечает за выбор регистра 378 или 37а?
Go to the top of the page
 
+Quote Post
vvs157
сообщение May 18 2005, 13:17
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 526
Регистрация: 8-04-05
Пользователь №: 3 960



Цитата(tangar @ May 18 2005, 15:23)
Еще один вопрос - какая нока на принтерном разъеме centronics отвечает за выбор регистра 378 или 37а?
*


То есть? Никакие ноги за выбор *регистра* не отвечают. 378 - это регистр данных (ноги D0-D7), 37A - это управляющий регистр - то есть выходные ноги служебных линий
Go to the top of the page
 
+Quote Post
tangar
сообщение May 18 2005, 16:29
Сообщение #13





Группа: Новичок
Сообщений: 10
Регистрация: 12-03-05
Пользователь №: 3 297



Простите, пост был написан впопыхах и с дурной головой.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01406 секунд с 7
ELECTRONIX ©2004-2016