Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: доступ к пинам LPT порта  (Прочитано 28611 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 02-03-2004 11:16 » 

Подскажите, какие функции API юзать для прямого доступа к пинам LPT порта - чтение и вывод. Или подскажите, где подскажут  Улыбаюсь
Записан

Lex
Специалист

ru
Offline Offline

WWW
« Ответ #1 : 02-03-2004 11:57 » 

Алексей1153, смотря что тебе надо?
Если какие-то стандартные протокола, то можно попытаться и так.В драйверах темы по этому поводу были. Если чего-то свое это уже драйвер свой или чей-то сторонний.
Записан

Megabyte be with you!
Anonymous
Гость
« Ответ #2 : 02-03-2004 15:12 » 

мне нужно организовать передачу данных из контроллера в комп, но по своему протоколу
Записан
Кот
Гость
« Ответ #3 : 11-03-2004 04:46 » 

http://junglewin.narod.ru/lpt.html

тут почитай.

Сам использовал готовую библиотеку inpout32.dll но сейчас не могу найти описания на нее осталась только она сама и код с выдачей данных на ногу порта
Записан
um
Гость
« Ответ #4 : 13-03-2004 21:23 » 

Алексей1153,
если ты юзаешь винды 9х или Ме, то ситуация может значительно упроститься - там порты для 3-го кольца по умолчанию открыты - поэтому можно сразу же обращаться к портам:
BASE - регистр данных
BASE+1 - регистр состояния
BASE+2 - регистр управления
номер BASE (тип word) для LPT1 (который сейчас есть на всех машинах) находится по смещению 408.
если надо могу написать пины и их примерное назначение (для стандартного обмена), которое ты видимо будешь затачивать под себя.
имей ввиду - некоторые пины - инверсны.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 14-03-2004 10:19 » 

Цитата

если надо могу написать пины и их примерное назначение


напиши, хотя, наверное, мне это не пригодится, но кто знает?

с 98 и ме - ладно, понятно, но уточни 408 - hex  или dec ?

А кроме того, мне бы надо и про остальные форточки, не только 98...

Всё равно спасибо
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 14-03-2004 11:36 » 

Прямой доступ к LPT - это проблема любой ОС с защитой железа от прямого доступа. Если устройство совместимо с IEEE1284, то общение можно организовать через API принтера (как именно - не спрашивай, не делал). Иначе нужен свой драйвер.
Различную инфу по распиновкам, портам, режимам и т.п. можно найти по ссылкам с этой страницы.
Допустимые адреса LPT для PC: 0x378, 0x278, 0x3bc.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
um
Гость
« Ответ #7 : 14-03-2004 20:14 » 

да, RXL прав - по смещению 0x408 (исправился) и т.д. лежат как раз эти цифры 0x378 и т.п.
в принципе, можно сразу использовать эти адреса, а не читать память, т.к. я в на практике всегда получал ожидаемые номера портов.
а вот примерное использование (по книге "разработка устройств сопряжения"):
Код:
конт.ПК     цепь           I/O      конт.девайса
1            strobe         O              1
2              D0           O              2
3              D1           O              3
4              D2           O              4
5              D3           O              5
6              D4           O              6
7              D5           O              7
8              D6           O              8
9              D7           O              9
10            ack           I              10
11            busy          I              11
12            pe            I              12
13            slct          I              13
14            auto fd       O              14
15            error         I              32
16            init          O              31
17            slct in       O              36
18..25     земля            -              16,17,19..30, 33
но в некоторых источниках я видел инфу, что шина данных D0..D7 - дуплексна, т.е. работает в обе стороны.
если принять, что девайс висит на LPT1 с номером 0x378, то (в скобках после порта указан соответствующий бит):
Код:
0x378(0..7) - для дуплексного обмена

0x379 - для чтения в компутер
0x379(0)  - strobe (инверсный)
0x379(1)  - auto fd (инверсный)
0x379(2)  - init (прямой)
0x379(3)  - slct in (инверсный)

0x37A - для записи в девайс
0x37A(3)  - error (прямой)
0x37A(4)  - slct (прямой)
0x37A(5)  - pe (прямой)
0x37A(6)  - ack (прямой)
0x37A(7)  - busy (инверсный)
на всякий случай поясню - если пин инверсный, то при записи в порт 1 по этому разряду на девайс реально уходит 0. и наоборот, если девайс ставит 1, то из порта читаем как 0.
на счет НТ-платформы - где-то на форуме (драйверы, кажется) видел обсуждение по теме открытия портов. поищи...
https://forum.shelek.ru/index.php/topic,187.0.html&highlight=
« Последнее редактирование: 24-11-2007 14:30 от Алексей1153++ » Записан
Daniloff
Помогающий

ru
Offline Offline

« Ответ #8 : 02-04-2004 08:28 » 

Об чем разговоры? Мне тоже подобная задачка попадалась. И скажу вам, что на NT-XP добиться результата тяжело. Билл Гейтс рекомендует открывать lpt1 вызовом CreateFile(), а дальше общаться с помощью DeviceIOctrl(), или банального WriteFile(). Но если принтер, назначенный на ваш порт, висит на паузе, то все ваши несчастные байты встанут в очередь! А если не стоит, то все равно девайс должен правильно реагировать на данные линиями busy-ack. Если пишешь прогу только для себя, можно установить драйвер типа directio и работать с портами как из-под ДОСа, а если хочешь выложить ее для всеобщего доступа - такой подход не хорош, т.к. не каждый сможет найти и правильно поставить такой драйвер. Тогда лучше делать девайс, который поддерживает протокол передачи данных, принятый для всех принтеров...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 02-04-2004 11:24 » 

Daniloff, а записывать непосредственно в память (через ссылку) Билл позволяет в NT и XP ?  Ага
Записан

Daniloff
Помогающий

ru
Offline Offline

« Ответ #10 : 02-04-2004 18:10 » 

Непосредственно в порт? Нет. Для обхода этой бяки и пишут всякие драйверы.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 02-04-2004 19:46 » 

почему же бяки? для меня щас - само то...
Записан

Daniloff
Помогающий

ru
Offline Offline

« Ответ #12 : 03-04-2004 08:00 » 

Я в том смысле, что запрет прямого доступа - бяка  Жжешь
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #13 : 03-04-2004 21:33 » 

Алексей1153,  Ты чего голову морочишь? Я думал ты уже давно всё сделал. :new_shot: В чём проблема-то?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 04-04-2004 01:38 » 

Джон, !!!, я же проверить возможность прямой записи в порт работу на других виндах не могу - а мне бы надо чтоб нигде не заткнулось. Ну, то есть ты же понял
Либо всё-таки юзать к-либо стандартное средство придётся...
Записан

um
Гость
« Ответ #15 : 05-04-2004 19:13 » 

про порты писал Aleck DShadow.
смысл: под NT - по умолчанию все порты закрыты. так вот, он пишет драйвер, который открывает нужный порт (лезет в битовую карту сегмента задачи и ставит нужный битик)
это не трудно сделать, особенно, если знаешь ассемблер и принципы защищенного режима.
есть толковая книжка Зубкова С.В. "Ассемблер для DOS, Windows и Unix". стронгли рекомендую иметь (каждому).
Записан
ol_ivanov
Гость
« Ответ #16 : 08-04-2004 12:55 » 

Есть программа для доступа к портам как в Win9X так и к NT. Назавается она VICX. Написал ее Матюнин еще где-то в 2000 году. Она скорее всего является небольшой переделкой программы PortIO из пакета DriverWorks фирмы Numega. В сети можно найти версию vicx1_3.zip. Ссылки можно найти по яндексу (некоторые ссылки битые, но можно найти и нормальные). К сожалению у меня сейчас нет этих ссылок, но они ищутся быстро.
В этом архиве есть примеры использования данной DLL'ки. Там работа идет через vicx95.dll (для Win9X) и vicx.dll и vicx.sys (для NT). Есть OCX. Работает для всех винд от 95 до ХР, сам лично тестировал, так как у самого возникла необходимость работать с устройством по LPT в разных виндах. Работать через эти драйвера можно с любыми портами в машине, не только с параллельными. Есть одно неудобство, вызов для 9Х отличается от вызова для NT. Но это можно обойти, если воспользоваться маленькой функцией:


BOOL bWinNT;

bWinNT = IsWindowsNT();

/*--------------------------------------------------------------------------
* Function: IsWindowsNT()
--------------------------------------------------------------------------*/
BOOL IsWindowsNT()
{
  OSVERSIONINFO ovi;
  ovi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  if (!GetVersionEx(&ovi))
    return FALSE;

  return ovi.dwPlatformId >= VER_PLATFORM_WIN32_NT;
}

и в программе в зависимости от операционной системы загружать библиотеки либо vicx95.dll либо vicx.dll. И естественно делать вызов для нужной операционки.

Если бы у Алексея1153 был почтовый ящик, я бы ему переслал эту библиотеку (~191к), а так извиняйте, я здесь случайный посетитель.
Записан
um
Гость
« Ответ #17 : 08-04-2004 20:41 » 

:?: интересно, что же такое надо положить в (~191к, чтобы просто открыть порты для LPT (тем более, что под 9x они открыты изначально)   Ага
Записан
ol_ivanov
Гость
« Ответ #18 : 09-04-2004 07:21 » 

Там лежат полный проект на VC++ примеров работы с любыми портами для двух типов операционок, драйверы sys и vxd, компоненты ОСХ этих библиотек, программы регистрации и деригестрации драйверов, ОСХ-объектов и всякая всячина. Для работы достаточно для Win9x библиотеки vicx95.dll(3584), а для NT vicx.sys(12488) и vicx.dll(4608).
Кстати, я в форуме случайно нашел мыло Алексея1153 на яндексе и переслал ему этот архив. Если это еще для него актуально, то пусть забирает, если нет, то может удалить письмо.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #19 : 09-04-2004 11:48 » 

спасибо, ol_ivanov, я всё получил - посмотрю как время будет.
Сейчас немного не тем занимаюсь
Записан

klumba
Гость
« Ответ #20 : 10-04-2004 09:37 » 

Короче! Я работал и работаю с LPT! под виндой - смтри стандартные функции CreateFile, соответственно Write и ReadFile. также прога в инете DlPortIO много где есть с библиотекой для Builder и Visual (просто подключаешь и работаешь)
для использования двунаправленного обмена смотри распиновку LPT порта и EPP или ECP стандарты и установки в биос! если не понятно я не виноват - я пьян!
Записан
um
Гость
« Ответ #21 : 12-04-2004 19:46 » new

вот такой вот клумба - молодец. все лаконично описал. а мы тут порожняк гоняем...  Отлично
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines