Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« : 02-03-2004 11:16 » |
|
Подскажите, какие функции API юзать для прямого доступа к пинам LPT порта - чтение и вывод. Или подскажите, где подскажут
|
|
|
Записан
|
|
|
|
Lex
|
|
« Ответ #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. если надо могу написать пины и их примерное назначение (для стандартного обмена), которое ты видимо будешь затачивать под себя. имей ввиду - некоторые пины - инверсны.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #5 : 14-03-2004 10:19 » |
|
если надо могу написать пины и их примерное назначение
напиши, хотя, наверное, мне это не пригодится, но кто знает? с 98 и ме - ладно, понятно, но уточни 408 - hex или dec ? А кроме того, мне бы надо и про остальные форточки, не только 98... Всё равно спасибо
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #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
Помогающий
Offline
|
|
« Ответ #8 : 02-04-2004 08:28 » |
|
Об чем разговоры? Мне тоже подобная задачка попадалась. И скажу вам, что на NT-XP добиться результата тяжело. Билл Гейтс рекомендует открывать lpt1 вызовом CreateFile(), а дальше общаться с помощью DeviceIOctrl(), или банального WriteFile(). Но если принтер, назначенный на ваш порт, висит на паузе, то все ваши несчастные байты встанут в очередь! А если не стоит, то все равно девайс должен правильно реагировать на данные линиями busy-ack. Если пишешь прогу только для себя, можно установить драйвер типа directio и работать с портами как из-под ДОСа, а если хочешь выложить ее для всеобщего доступа - такой подход не хорош, т.к. не каждый сможет найти и правильно поставить такой драйвер. Тогда лучше делать девайс, который поддерживает протокол передачи данных, принятый для всех принтеров...
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #9 : 02-04-2004 11:24 » |
|
Daniloff, а записывать непосредственно в память (через ссылку) Билл позволяет в NT и XP ?
|
|
|
Записан
|
|
|
|
Daniloff
Помогающий
Offline
|
|
« Ответ #10 : 02-04-2004 18:10 » |
|
Непосредственно в порт? Нет. Для обхода этой бяки и пишут всякие драйверы.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 02-04-2004 19:46 » |
|
почему же бяки? для меня щас - само то...
|
|
|
Записан
|
|
|
|
Daniloff
Помогающий
Offline
|
|
« Ответ #12 : 03-04-2004 08:00 » |
|
Я в том смысле, что запрет прямого доступа - бяка
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
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."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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 на яндексе и переслал ему этот архив. Если это еще для него актуально, то пусть забирает, если нет, то может удалить письмо.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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 » |
|
вот такой вот клумба - молодец. все лаконично описал. а мы тут порожняк гоняем...
|
|
|
Записан
|
|
|
|
|