Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Запись в LPT порт

Автор: KVCH
Дата сообщения: 14.11.2003 03:34
делаю так

OUT 888, 0

в 98й работает... в ХР - нет...

что делать ?

если кто может, помогите сделать на с++... желательно под винду, (не консольное)...
Автор: EvilFly
Дата сообщения: 14.11.2003 17:32
Надо свой драйвер писать или использовать готовые библиотеки
Разная инфа по теме есть здесь:
http://www.lvr.com/parport.htm
и на форуме :
http://forums.devshed.com/t28759/s.html
Автор: bob12345
Дата сообщения: 15.11.2003 09:32
KVCH
У меня готовая ДЛЛ валялась. Если надо, могу поискать.
Автор: KVCH
Дата сообщения: 16.11.2003 02:56
bob12345

поищи...
Автор: bob12345
Дата сообщения: 16.11.2003 15:53
KVCH
У меня куча ДЛЛ для разных случаев ЛПТ. Давай мыло в ПМ - закину, разберешься.
Автор: Dem Max
Дата сообщения: 16.01.2004 11:37
Могу подкинуть драйвер (*.sys) для расшаривания портов в NT
Автор: KVCH
Дата сообщения: 17.01.2004 12:51
Dem Max
my@kvch.dp.ua
Автор: Arion
Дата сообщения: 17.01.2004 15:19
А чем простите CreateFile(TEXT("LPT1"),...) не устраивает?
Автор: Dem Max
Дата сообщения: 19.01.2004 13:11
Arion почему CreateFile(TEXT("LPT1"),...) а не OpenFile("LPT1",.....); или хотя бы CreateFile("LPT1",.....); первое я когдато пытался использовать но ничего не вышло, а про второе не помню, Хотя хочю заметить про режимы LPT порта, бывают ECP, EPP, и у каждого есть свои настройки, по крайней мере я пользуюсь драйвером для расшаривания порта, а всвоей проге вставляю ассемблерные вставки, потому что Builder C++, не понимает команды outportb, inport, жди 20 числа отправлю.
Автор: Arion
Дата сообщения: 19.01.2004 16:46
Начнем с того, что функция OpenFile оставлена только ради совместимости с Win16 приложениями и все равно внутренним образом вызывает CreateFile. В Win32 API с помощью функции CreateFile можно работать не только с дисковыми файлами, но и с дисками, каталогами, именованными каналами, майлслотами, портами и пр пр. CreateFile(TEXT("LPT1"),...) используется чтобы программу можно было без переделок компилировать как для платформы, ориентированной на использование Unicode (Win2K), так и для ANSI (Win9X). Если мне не изменяет память настройками порта можно управлять через DeviceIoControl, передавая ей дескриптор порта, полученный с помощью CreateFile.
Автор: Dimentiy
Дата сообщения: 21.01.2004 18:19
Вообщем скажу так: сам долго с этим возился.

CreateFile, WriteFile и т.д. это лишь частные случаи DeviceIOControl, которые отправляют драйверу соответстующие IRP запросы... Но дело не в этом.

CreateFile("LPT1"...) пройдёт и GetLastError не выругается, и пройдёт даже WriteFile (GetLastError) Вернёт operation complited successefuly, но сигналов на выходе с порта не получиться (проверял осцилографом).

Тут есть два пути:
1. Действительно изменить драйвер (DDK comm.drv), причём как для COM так и для LPT это один файл.
2. Написать или использовать уже емеющуюся службу(драйвер), которая откроет вашему процессу доступ к портам ввода-вывода из user mode. Но это уже на ваш страх и риск, т.к. в этом случае система не сможет синхронизировать доступ различных потоков (в различных процессах) к этим портам с вашими потоками.
Есть такая штука - WinIO.sys вроде... вот она как раз и является вариантом 2.
Автор: Dem Max
Дата сообщения: 22.01.2004 11:34
Получил мое письмо ? если будут вопросы можно просто на мыло написать !!!
Автор: Handler
Дата сообщения: 23.01.2004 12:52
Dimentiy
А вот про ето поподробнее могеш?

Цитата:
Есть такая штука - WinIO.sys вроде... вот она как раз и является вариантом 2.

Автор: Dimentiy
Дата сообщения: 28.01.2004 10:25
Про что именно?

Добавлено
Блин, пардон, вот слепая курица, не заметил, извини.
Ну по подробнее конечно могу, но это не здесь ,наверное, и лучше всётаки, я думаю, будет взять что-нибудь по солиднее чем мои объяснения.
Достойная книжка Walter Oney "Programming Windows Driver Model" или сходи на сайт
_www.wasm.ru вроде, там тоже есть кой чего.

Удачи!

Добавлено
В догонку, если желаешь, могу выслать этот драйверочек...
Автор: TsAN
Дата сообщения: 28.01.2004 12:03
Вообще то в многозадачных ОС прямое управление портами из прикладных программ требует соблюдения ряда условий и в нормальных случаях обычно не допускается. Однако в ОС класса W9x контроля за доступом к портам не ведется, что и позволяет создавать программы, в ряде случаев весьма эффективные, но в стиле DOS. Очевидно, программа, о которой идет речь у KVCH, является именно такой.

В принципе можно пытаться напрямую работать с портами и со стандартными драйверами. Обычно в таких случаях возникают следующие неприятные моменты:
1. Драйвер является программой с повышенным интеллектом и не станет выводить данные при отсутствии готовности внешнего устройства (ВУ) их принять. Лечится довольно просто: необходимо непосредственно на разъеме обеспечить необходимую последовательность сигналов.
2. По той же причине в ряде драйверов предусмотрена: инициализация ВУ непосредственно перед выводом, перекодировка, символы – заполнители. Естественно, что в этом случае сигналы на выводах разъема отличаются от передаваемой драйверу информации. Перекодировка в ряде случаев может быть излечена соответствующим кодированием перед передачей информации драйверу, иначе, как и в остальных двух вариантах, метод лечения - поиск подходящего драйвера.
3. Учитывая, что при работе через драйвер накладные расходы (программно-временные затраты на активизацию драйвера и т. п.) мало зависят от объема передаваемой информации, в большинстве случаев данные вначале помещаются в буфер. Передача накопленного массива происходит либо по мере заполнения буфера, либо при выполнении операции закрытия канала. Методов лечения два: либо выполнение открытия/закрытия (или их аналогов: CREATE, LOCK и т.д.) для каждого выводимого байта, что резко снижает скорость вывода, либо представление каждого выводимого байта в виде массива, размер которого превышает размер буфера.

Поэтому в любом случае применение уже упоминавшихся драйверов, позволяющих пользовательскому приложению монопольно захватить порт, смотрится более предпочтительным.
Автор: DesertFox
Дата сообщения: 29.01.2004 10:59

Цитата:
Драйвер является программой с повышенным интеллектом и не станет выводить данные при отсутствии готовности внешнего устройства (ВУ) их принять.
Собственно у меня проблема такова: Внешнее устройство является не цифровым, а аналоговым устройством. По сути с каждой DATA жилки разьёма (2-9) LPT мы снимает потенциал. Если он на какой-то жилке есть - работает соответствующая часть управляемой схемы. Вот такой изврат. То есть необходимо, чтобы в порт просто вылетал байт и оставался на нём, пока не вылетит другой байт. (Скорости около 1 байта в минуту). Вот такой изврат.
Под ДОС и Win98 - всё просто здорово. NT либо выдаёт ошибку, либо вешает приложение.
Дополнительные ограничения: дрова трогать низя. Как максимум можно выставить SPP.
Идеальный вариант - исходники с комментариями на C++ Builder. Рабочий вариант - библиотечка с документацией.
Автор: nautiluss
Дата сообщения: 30.01.2004 07:13
DesertFox
У тебя есть готовое решение,(управление LPT портом) для ДОС и Win98, я правильно понял? Если не сильно затруднит, то может поделишься. Хочется посмотреть...

Я тоже в данный момент работаю над железкой, которая включает-выключает какое-либо устройство (хоть эл. чайник или настольную лампу) по команде с компьютера и удаленное управление этим устройством. Например: повис сервер, соединяемся из дома по модему с компьютером (любым) к которому подключено это "устройство" посылаем команду включить-выключить, все. И так можно произвольно управлять восьми устройствами в моем случае (количество устройств может быть любое другое, хоть 200 шт.), хоть из другого города. Прога пишется на Delphi6.
Автор: TsAN
Дата сообщения: 30.01.2004 13:29
DesertFox

Вообще-то в NT для прямой записи в порты программа должна иметь статус драйвера.
Как вариант попробуй выбрасывать массив одинаковых данных, изменяя их примерно 1 раз в минуту. В простейшем случае - должно сработать и copy /b Fail_Name PRN, правда, файл вначале придется подготовить. Необходимые для нормальной работы драйверов временные диаграммы сигналов для LPT порта можно найти в сети - в оригинале это интерфейс Centronics, иногда так же встречается и в мануалах на принтеры.
А подключать к шине данных порта LPT свое устройство вовсе не является извратом -порт для того и предназначен, чтобы с него сигнал снимать. В описанной ситуации уж если что и попадает под такое определение, так это попытка управлять нестандартным устройством при помощи стандартных драйверов. Если серъезных требований работать только под NT нет, то гораздо корректнее работать под однозадачной ОС. Иначе - искать или писать самому драйвера, в данном случае - символьно ориентированные.
Автор: Dem Max
Дата сообщения: 31.01.2004 08:23
Повторяюсь
--------------------------------------------------------------------------------
Могу подкинуть драйвер (*.sys) для расшаривания портов в NT
С исходниками.

От вас остается тлько запустить драйвей, из вашей программы (Текст тоже есть), и посылать в порт данные по командам ассемблера: IN, OUT, или си: outportb, inportb.
Автор: DesertFox
Дата сообщения: 31.01.2004 23:21
Млин, стоило мне оставить комп не залоченым, успели в форуме перелогиниться, а я не заметил. Хоть бы "выход" нажали... Потёр месагу.
nautiluss

Цитата:
У тебя есть готовое решение,(управление LPT портом) для ДОС и Win98, я правильно понял? Если не сильно затруднит, то может поделишься. Хочется посмотреть...

У меня не готовое решение, мне показали, что под DOS на паскале это в три строчки пишется и продемонстрировали. По поводу всего готового - в магазине Чип и Дип на Проспекте Мира вчерась видел комплект в виде готовой печатной платы, LPT конектора, дискетки с дровами.
"NK150 Программируемый 8-канальный исполнительный блок 750руб"
http://www.masterkit.ru/main/set.php?num=450
Из неприятного: нет гальванической развязки - есть вероятность спалить порт.
Туплю и не врубаюсь, что за две микрухи и чем они занимаются.

Если кто прояснит - отдельное спасибо.

Какие дрова есть - не знаю, если кто знает - свистите.
Конкретно под эту игрушку разработано немного софта, кторый лежит тута http://www.masterkit.ru/info/linkshow.php?num=72

Dem Max
Буду очень признателен, если вы подарите мне копию вашей софтинки, о чем пишу в ПМ.
Автор: TsAN
Дата сообщения: 02.02.2004 13:56
DesertFox

Цитата:
"NK150 Программируемый 8-канальный исполнительный блок 750руб"
http://www.masterkit.ru/main/set.php?num=450
Из неприятного: нет гальванической развязки - есть вероятность спалить порт.


Гальваническая развязка обеспечивается применением реле


Цитата:
Туплю и не врубаюсь, что за две микрухи и чем они занимаются.


Усилители, поскольку непосредственно выходы LPT реле просто не потянут. Конкретный тип определить затруднительно, но в принципе можно применить любой подходящий шинный формирователь или инвертор с открытым коллектором. Лучше применять с инверсией, т. к. по логичнее, если ток на реле подается при лог. 1 на выходе порта. Для реле с обмоткой до 15В/40 мА вполне подойдет 155ЛН3/133ЛН3 (SN7406/SN5406)
Автор: jiday
Дата сообщения: 23.07.2005 03:25
Господа, прошу прощения - может не совсем в тему, но предлагаю посмотреть сюда_http://www.bksoft.de/licht24pro_e.htm.
- работает не только с LPT, но и c COM, USB и т.д.
Таимеры - до 86400 команд в день, недельные программы
99 программ, управление источниками света под музыку и многое другое....

Серийник так и не нашел, может кто-нибуть поможет?
Автор: mr_eoi
Дата сообщения: 23.07.2005 09:41
jiday
04:25 23-07-2005
Цитата:
Господа, прошу прощения - может не совсем в тему, но предлагаю посмотреть сюда_http://www.bksoft.de/licht24pro_e.htm.
- работает не только с LPT, но и c COM, USB и т.д.
Таимеры - до 86400 команд в день, недельные программы
99 программ, управление источниками света под музыку и многое другое....

Серийник так и не нашел, может кто-нибуть поможет?

За серийниками ходим в "Варезник"
А в этом разделе поиск серийников не разрешен.
Автор: ifndefventura
Дата сообщения: 01.08.2005 13:42
Доброго дня,

мне надо сэмулировать Generic принтер на первом компе (WinXP), чтобы второй комп послал файл, а первый бы просто сохранил его на винте.
если делаю так:

HANDLE hLpt =CreateFile( "LPT1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
if(!hLpt) {
DisplayError();
return 0;
}

PARCLASS_NEGOTIATION_MASK pn;
res = DeviceIoControl(hLpt, IOCTL_IEEE1284_GET_MODE, NULL, 0, &pn, sizeof(pn), &ret, NULL);

DeviceIoControl возвращает 0 с ошибкой недопустимая функция. Что я делаю не так?

спасибо.

Страницы: 1

Предыдущая тема: Объявления о работе для программистов


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.