Спасибо Ntrud, за прогу . Попробую обязательно, но в Визуальной Ваське слаб (точнее вообще им не пользовался, со времен СКРЭ им. П.Н. Яблочкова, а там был не визуальный, а обычный под DOS).
Пробовал по совету Lavr-а воспользоваться IOCTL_PAR_QUERY_INFORMATION. У меня опять ни Х…. не работает . На этот раз приложение не виснет, но в ParInfo.Status, какие комбинации сигналов на ножки статуса я не подаю, все по нулям. А именно не откликаются ни один из битов :
type PAR_QUERY_INFORMATION = record Status: byte; end; PPAR_QUERY_INFORMATION = ^PAR_QUERY_INFORMATION;
var hLpt: THandle; ret: DWORD; ParInfo: PAR_QUERY_INFORMATION; lpOverlapped: POverlapped;
procedure TForm1.Button1Click(Sender: TObject); begin DeviceIoControl(hLpt, IOCTL_PAR_QUERY_INFORMATION, nil, 0, @ParInfo, sizeof(PAR_QUERY_INFORMATION), ret, lpOverlapped); if (PARALLEL_INIT and ParInfo.Status) = PARALLEL_INIT then Label1.Color:=clRed else Label1.Color:=clBtnFace; if (PARALLEL_AUTOFEED and ParInfo.Status) = PARALLEL_AUTOFEED then Label2.Color:=clRed else Label2.Color:=clBtnFace; if (PARALLEL_PAPER_EMPTY and ParInfo.Status) = PARALLEL_PAPER_EMPTY then Label3.Color:=clRed else Label3.Color:=clBtnFace; if (PARALLEL_OFF_LINE and ParInfo.Status) = PARALLEL_OFF_LINE then Label4.Color:=clRed else Label4.Color:=clBtnFace; if (PARALLEL_POWER_OFF and ParInfo.Status) = PARALLEL_POWER_OFF then Label5.Color:=clRed else Label5.Color:=clBtnFace; if (PARALLEL_NOT_CONNECTED and ParInfo.Status) = PARALLEL_NOT_CONNECTED then Label6.Color:=clRed else Label6.Color:=clBtnFace; if (PARALLEL_BUSY and ParInfo.Status) = PARALLEL_BUSY then Label7.Color:=clRed else Label7.Color:=clBtnFace; if (PARALLEL_SELECTED and ParInfo.Status) = PARALLEL_SELECTED then Label8.Color:=clRed else Label8.Color:=clBtnFace; end;
procedure TForm1.FormCreate(Sender: TObject); begin hLpt := CreateFile('LPT1', GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0); end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin CloseHandle(hLpt); end;
end.
Чо я опять не так делаю?! Не пойму.
Да и еще что хочу сказать. Не может быть, чтобы из этой ситуации был только один выход – писать драйвер (чужими из принципа пользоваться не хочу). Хочется малой кровью обойтись, а именно стандартными API. Ведь мне нужно всего на всего периодически проверять состояния концевых выключателей и все. Но можно конечно и что-нибудь посложнее (это ни кому не помешает).
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Квас, вопрос, вероятно, совершенно глупый... но вдруг?
А ты не пробовал на линии данных своего 'LPT1' что-то подать и проверить на выходе?
Был у меня случай - под ДОС-ом работал я с портом как раз 'LPT1' - и всё было хорошо, а из-под Венды ничего не получалось... Выяснилось, что под Вендой он вовсе не 'LPT1', поскольку Венда считает, что у неё 'LPT1' - виртуальный ИК-порт...
Также недавно я себе Блу-зуб через USB прицепил, и Венда сдвинула мой СОМ-порт, что озадачило... т.к. не мог попасть в кабель сотового телефона.
Когда НИЧЕГО не отвечает, возникает сомнение - мы вобще в нужный порт попадаем?
Да в том то и дело, что я же в этот же порт пишу (светодиодики перебераю) и все получается, а вот читать не в какую.
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
...драйвера пишутся не для LPT порта (к примеру), а для устройства, которое работает через этот порт, а у него может быть свой протокол обмена.
То есть - этот стандартный драйвер Венды хочет, чтобы внешнее твоё устройство было а-ля "принтером"!
Цитата:
...Windows требует точного соблюдения аппаратного протока обмена с внешними устройствами. Другими словами, у Вас не получится управлять, например, светодиодом подключенным к одному из выводов параллельного порта. Просто потому, что система будет требовать отработки и сигналов STROBE и ACK. Если Вас это не устраивает, то выход один - писать собственный драйвер вооружившись DDK.
Здесь где-то на форуме мы смотрели с тобой пример как это делают...
То есть все сходятся в одном, чтобы этот нативный драйвер Венды работал - надо соблюдать протокол...
Цитата:
...создается такое впечатление, что все это очень уж жестко ориентировано на принтеры и сканеры и т.п., включая встроенные в драйвер задержки.
То есть получается, что зажигать светодиоды через этот драйвер возможно, но драйвер считает, что "скормленный" байт внешним устройством по протоколу не "съеден".
Вот такая загогулина... Но мы попробуем - через PureBasic!
PS. Кстати - там подтвердили, что "кривой" драйвер можно написать самому, как я тебе и рассказывал:
Цитата:
У меня была такая-же проблема. Выдрал из WinIO куски кода для входа и выхода их нулевого кольца и вставил в свою прогу. Работает конкретно, быстро...
PPS. И, наконец - последнее, я и сам этого не знал:
Цитата:
Попытка вызвать DeviceIoControl(hLpt, IOCTL_PAR_QUERY_INFORMATION, NULL, 0, &ParInfo, sizeof(ParInfo), &ret, NULL); возвращает ошибку - неверная функция. Если в BIOS стоит режим порта ECP, EPP или ECP + EPP (конкретное значение зависит от версии BIOS естественно), данная функция не работает. Если настройка NORMAL, STANDART, SPP (или что то в этом роде - все нормально).
Последний раз редактировалось Lavr Ср июл 18, 2012 23:24:15, всего редактировалось 1 раз.
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Хм, на упомянутом выше PureBasic, можно самому написать нормальный драйвер режима ядра для работы с портами. Вот пример драйвера для 32 и 64 битных Windows на PureBasic. http://purebasic.mybb.ru/viewtopic.php?id=322 Там же кстати, есть очень простой пример работы с LPT портом.
Код:
Out($378, 120) Byte = Inp($378)
MessageRequester("", Str(Byte))
Пример просто записывает число 120 в порт LPT1 и считывает его, а затем отображает на экране.
Если бы Вы были чуть внимательнее, то обратили бы внимание, что цель топика и самого топикстартера была совершенно иная.
Kvasshtain писал(а):
...драйверами посторонними я стараюсь не пользоваться. Мне больше нравится через Win API работать с портами. ... Хочется малой кровью обойтись, а именно стандартными API.
Что мы и попытались осуществить. "Есть много разного на свете, брат Горацио" на чём мы сможем сий драйвер написать...
PS. Квас, ну и сам "nibble mode" - не подарок... Чтобы в нем можно было работать, "устройство" на линиях LPT должно "откликнуться", как поддерживающее "nibble mode"... Так что "малой кровью" уже не кажется столь малой - разве только драйвер за собой не таскать...
Последний раз редактировалось Lavr Чт июл 19, 2012 00:38:46, всего редактировалось 1 раз.
Сделал пример из кода, ссылка на который была выше. Программа состоит из одного EXE-файла, в который вшиты два драйвера - для x86 и x64 систем. Используется тот, который соответствует разрядности системы на которой запущена программа.
Код программы мало чем изменился.
Код:
XIncludeFile "pbdriverio_Framework.pbi"
Procedure SendLPT1(hDriver) ; Процедура передачи данных в LPT1 Out.c=0 For i=8 To 1 Step -1 ; В цикле сканируются "флажки" (CheckBoxGadget) отвечающие за пины порта If GetGadgetState(i)=1 ; Определяем состояние "флажка" Out | 1 ; Операция "Логическое ИЛИ" Else Out & %11111110 ; Операция "Логическое И" EndIf If i>1 Out << 1 ; Сдвиг переменной на 1 бит влево EndIf Next i PortOut(hDriver, $378, Out) ; Данные в LPT1 EndProcedure
hDriver = OpenDriver_PB_IO(@ErrCode) If hDriver = 0 MessageRequester("Ошибка доступа к драйверу", "Код ошибки: "+Str(ErrCode)) EndIf
; Открываем окно OpenWindow(0,0,0,120,240,"lpt Pin", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_Invisible) Frame3DGadget(#PB_Any,20,10,80,180,"Pins") y=28 For i=1 To 8 CheckBoxGadget(i,36,y,50,16,"Pin "+Str(i)) ; "флажки" y+20 Next i ButtonGadget(9,6,210,110,24,"Отправить в LPT 1") ; Экранная кнопка HideWindow(0,0) ; Отображение окна на экране
Repeat ; Главный (оконный) цикл программы "Repeat - Until" Event=WaitWindowEvent() ; Идентификатор события If Event=#PB_Event_Gadget ; Произошло событие в гаджете Gadget=EventGadget() ; ID гаджета, в котором произошло событие If Gadget=9 ; Обнаруден клик по экранной кнопке SendLPT1(hDriver) ; Процедура передачи информации по порт LPT1 EndIf EndIf Until Event=#PB_Event_CloseWindow ; Когда закрывают окно, цикл будет прерван и прога завершит работу.
Если я правильно понял драйверы находятся в самОм EXE-шнике... в ресурсах?
Нет, в секции .data исполняемого файла, но по большому счету это не имеет значения.
Lavr писал(а):
То есть в виде файлов на диск драверы не распаковываются?
Драйвер извлекается во временную папку текущего пользователя (если его там не было, или был но не совпала контрольная сумма), запись в которую возможна даже с ограниченными правами.
Lavr писал(а):
Вот этот механизм поясните
Функция OpenDriver_PB_IO() находится в файле "pbdriverio_Framework.pbi", который подключается в начале кода. В архиве есть исходники, в т. ч. указанный файл.
Драйвер извлекается во временную папку текущего пользователя (если его там не было, или был но не совпала контрольная сумма), запись в которую возможна даже с ограниченными правами.
Вот этот момент меня как раз очень интересовал... Использовал я подобный приём, чтобы с программой всегда был файл собственных оригинальных шрифтов... Так вот под Вендой, начиная с ХР нарывался, что у меня (у программы) недостаточно прав для записи... Как с такой проблемой справляться? Тем более, что не замечал за ней никакой регулярности...
Извините конечно, может и не в тему - А в чем именно удовольствие режима "Nible" , может сразу подходить правильно к задаче: - есть протокол обмена, Bidirect/EPP/ECP - надо внешняя логика - которая обеспечивает вывод/ввод данных в регистр (читаем 8 контактов вывод) / с буфера (читаем ещё 8 контактов вход) . - далее - программа - которая проста по сути запись/чтение т.к. всё в соответствии с стандартом. Или надо вообще без внешней логики ??
1. "nibble mode", по крайней мере согласно всей документации, должен быть доступен во всех режимах, чего не скажешь про остальные режимы.
2. Если мы используем стандартные функции Win-Api, то нет необходимости иметь сторонний драйвер для работы с портом.
3. Как оказалось, сказанное выше справедливо лишь в идеале. На практике же на многих форумах обуждают, что по разным причинам так просто не получается...
Между делом, попереключал режимы работы LPT-шника в BIOS-е, отрубил ECP+EPP и оставил тока SPP, и моя первая прога по записи данных LPT (которая работала) работать перестала , но обратимо, поменял обратно и все опять запахало. НО!!! Запрос IOCTL_PAR_QUERY_INFORMATION все равно ни ХЭ не работает, етит его на х… , ни так ни вот так.
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Так... Многое стало проясняться. Пока полный развернутый ответ сделать не могу. Нет времени. Оказалось, что код все-таки рабочий. Проверил на другой машине. Читалка работает, но все же не все пока ясно. Скоро, как только разделаюсь с делами, усиленно налягу на эту проблему. А то прям тоска взяла: с COM-портом – разобрался, с USB-портом – разобрался, а с LPT (на мой взгляд – самым простым) ни в какую.
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Ну скажи мне такую вещь тогда: если мы выставим в БИОС - одни настройки, а сами уже программно переключим его (LPT-порт) в другие настройки (скажем, ECP+EPP) что от этого принципиально изменится?
Или протоколы лезут в БИОС узнать настройку?
А запутано всё, потому что LPT-порт в принципе аппаратно разный. Мне казалось раньше, что он потомок К580ВВ55... Но реально оказалось, что в оригинале он был вовсе сделан из дискретных регистров! А все остальные режимы, они гораздо позже к нему прикрутились... Я совсем недавно нашел схему оригинального LPT-порта в исполнении IBM!
Хотя есть всё-равно в сегодняшнем LPT что-то от режимов 1 и 2 БИС К580ВВ55...
Вопрос сложный. Дело в том, что не только операционки (на том, что не работает стоит Win98, а на том что работает WinXP) но и компы были разные. Надо на тот, на котором все работает и стоит WinXP поставить Win98 и тоже поэкспериментировать. На тот на котором ни ХЭ ни работает WinXP не встанет (точнее наверное встанет, но комп загнется). Если все на рабочем будет работать и под WinXP и под Win98, то тогда – это какая-то аппаратная хрень, которая потребует отдельного рассмотрения. Что касается BIOS-а, то во всяком случае win-API при переключении в другой режим в BIOS-е – работать перестают. Работа через драйверы мною не проверялась.
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения