Кошаны ! Помогите разобраться с nibble mode у LPT. Я написал в Lazaruse (ну можно считать, что это Delphi) простую прогу для чтения данных из LPT в режиме nibble mode. Использовал стандартные API. Но чо то они не читаются ни фига. Я просто переключатели поставил на линию состояния (5-штук по числу сигналов). Что я делаю не так?
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Просто так обращаться к LPT на современных компах не получится, драйвер надо использовать. К примеру, в программаторе uniprof используется LPTWDMIO.SYS
Да я это все знаю . И драйверами посторонними я стараюсь не пользоваться . Мне больше нравится через Win API работать с портами. И писать в порт (светодиодиками управлять) у меня прекрасно получается. А вот читать ни в какую . Там очевидно загвоздка в правильности подачи сигналов квитирования. И вот тут то я и хочу спросить, как это правильно делать схемотехнически.
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
type PARCLASS_NEGOTIATION_MASK = record usReadMask: word; usWriteMask: word; end; PPARCLASS_NEGOTIATION_MASK = ^PARCLASS_NEGOTIATION_MASK;
var hLpt: THandle; ret: DWORD; Address: byte; Data: byte; // данные для чтения ReqMode, LptMode: PARCLASS_NEGOTIATION_MASK; lpOverlapped: POverlapped;
procedure TForm1.FormCreate(Sender: TObject); begin // Открыть порт для синхронного доступа hLpt := CreateFile('LPT1', GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0); ReqMode. usReadMask:= $0010; // Режим BYTE_BIDIR (только для чтения) ReqMode. usWriteMask:= $0000; // Режим NONE (только для записи), т.е. не пишем вообще // Задаем режим DeviceIoControl(hLpt, IOCTL_IEEE1284_NEGOTIATE, @ReqMode, sizeof(PARCLASS_NEGOTIATION_MASK), @LptMode, sizeof(PARCLASS_NEGOTIATION_MASK), ret, lpOverlapped); end;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin // Закрыть устройство CloseHandle(hLpt); end;
end.
Приложение работает, но при нажатии на кнопку “прочитать”, просто виснет, чего то ожидая. Вот как раз что оно ждет?
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Последний раз редактировалось Kvasshtain Пт окт 28, 2011 14:14:33, всего редактировалось 1 раз.
Прием байта данных в полубайтном режиме состоит из следующих фаз: 1. Хост сигнализирует о готовности приема данных установкой низкого уровня на линии HostBusy. 2. ПУ в ответ помещает тетраду на входные линии состояния. 3. ПУ сигнализирует о действительности тетрады установкой низкого уровня на линии PtrClk. 4. Хост устанавливает высокий уровень на линии HostBusy, указывая на заня-тость приемом и обработкой тетрады. 5. ПУ отвечает установкой высокого уровня на линии PtrClk. 6. Шаги 1-5 повторяются для второй тетрады.
Вопрос: Каким образом можно тупо, без всяких там схемотехнических ухищрений принять байт, состоящий из двух одинаковых половинок по 4-ре бита, например 01100110 или 11001100, установив соответствующие переключатели на соответствующих сигнальных линиях LPT порта? Т.е. просто проверять наличие соответствующих сигналов?
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Да ! Точно! Что-то, я сам не догадался . Надо будет попробовать. Обещаю отписаться с результатом. Правда, там наверное важны задержки сигналов. А может и нет.
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Ни фига ни чего не получилось. Опять та же хрень, пытаюсь прочитать и приложение виснит. Может быть что-то в алгоритме или настройке.
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45 Сообщений: 1995 Откуда: Цветочный город
Рейтинг сообщения:0
для винды LPT прочно ассоциируется с принтером, поэтому работа через функции ввода-вывода возможна только при наличии следующих условий: 1. нет сигнала Paper End 2. нет сигнала Busy оба эти сигнала заводятся на пины LPT-порта и как раз-таки соединены (аппаратно-програмно) с битами в том самом регистре, который вы надеетесь прочитать. выходит, либо вы должны пожертвовать 2-я из 5-и битов, либо все-таки использовать библиотечку доступа к портам напрямую без WinAPI. кстати, я далеко не уверен, что при помощи WinAPI вообще можно достучаться до каких-то регистров, кроме регистра данных LPT...
_________________ битва с дураками проиграна, победители торжествуют. слава победителям!
Что касается 1. нет сигнала Paper End 2. нет сигнала Busy Всмысле я должен подать на эти ножки ноль и все? Или я что-то не понял?
Вот здесь (правда очень витиевато) http://citforum.ru/operating_systems/windows/parp_win/ написано про запись и чтение LPT. Как я понял, автор там читает в режиме nibble mode, т.к. в коде он ни чего не перенастраивает, а как он сам сказал «Сразу после того, как порт открыт, он устанавливается в режим CENTRONICS по записи и NIBBLE по чтению». Да, и кстати, я руководствуясь этой статьей написал вполне рабочую программу – бегущий огонь. Вот код:
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction); begin Data:=0; // в конце потушим диод WriteFile(hLpt, Data, 1, ret, nil); // Закрыть устройство CloseHandle(hLpt); end;
procedure TForm1.FormCreate(Sender: TObject); begin // Открыть порт для синхронного доступа hLpt := CreateFile('LPT1', GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0); ReqMode. usReadMask:= $0010; // Режим BYTE_BIDIR (только для чтения) ReqMode. usWriteMask:= $0002; // Режим IEEE_COMPATIBILITY (только для записи) // Задаем режим DeviceIoControl(hLpt, IOCTL_IEEE1284_NEGOTIATE, @ReqMode, sizeof(PARCLASS_NEGOTIATION_MASK), @LptMode, sizeof(PARCLASS_NEGOTIATION_MASK), ret, lpOverlapped); Data:=$80; // в начале будет гореть крайний левый диод end;
procedure TForm1.Timer1Timer(Sender: TObject); begin if direction = true then Begin Data:=Data shl 1; If Data = 0 then Data:=1; // если дошли до конца, то начнем с другого конца end else Begin Data:=Data shr 1; If Data = 0 then Data:=$80; // если дошли до конца, то начнем с другого конца end; WriteFile(hLpt, Data, 1, ret, nil); end;
end.
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Карма: 1
Рейтинг сообщений: 5
Зарегистрирован: Ср май 11, 2011 21:37:45 Сообщений: 1995 Откуда: Цветочный город
Рейтинг сообщения:0
одно дело работать с LPT на запись - тут вообще можно пользоваться паскалевской функцией write даже без WinAPI. и совсем иное дело работать с LPT на чтение. тем более на чтение не из регистра данных, а из служебных регистров.
_________________ битва с дураками проиграна, победители торжествуют. слава победителям!
Оу, забыл сказать, недавно обнаружил, что некоторые программы для работы с LPT портом наворачивают нормальную работу сего кода. Вот здесь http://www.freepascal.ru/forum/viewtopi ... =13&t=7500 я спрашивал об этом у знающих людей.
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Да вот хорошо бы найти все-таки рабочий примерчик, или инфу хоть какую-нибудь про чтение в этом режиме. Это же очень удобно, например, для считывания состояния концевых выключателей в каком-нибудь самодельном станке.
_________________ Говорят, что у него нет носа и рта, и что он общается телепатией. Говорят, что у него зеленая кожа, и он питается как растение, закопав ноги в землю и подставив спину солнцу. Все что знаем мы: его зовут Вовэн.
Посмотри исходник - они на вывод поступают, как и ты:
Код:
' Запись данных в порт LPT1. ' Примечание. Данные из параллельного порта нельзя прочитать с помощью функции ReadFile. Console.WriteLine("Запись следующих данных в порт LPT1: тест") Success = WriteFile(hParallelPort, Buffer, Buffer.Length, BytesWritten, IntPtr.Zero) If Success = False Then Throw New CommException("Не удается записать данные в порт LPT1") End If
А как же всёж читать?
Читать в других источниках советуют так:
Цитата:
А вот чтобы читать из микроконтроллера, придётся через DeviceIoControl опрашивать статусные линии и по ним принимать информацию в nibble mode.
Код:
const char lpt[] = "LPT1"; HANDLE hLpt = 0; UCHAR ParInfo; // сюда примем состояние статусных входов LPT DWORD ret;
ну во первых изначально LPT читать (регистр данных) нельзя было. только писать. Но начиная с 286 машин, некоторые контроллеры могли читать из регистра данных. Обычно нужно было разрешить в биосе(если был такой флажок там) и собственно сам контроллер LPT умеющий читать.
но у порта всегда было 5 линий состояний. вот по ним, по 4 бита плюс строб и передавались данные. как это делать под форточками - надо вкуривать WinAPI. если нет реальных 5 бит состояния порта - то никак...только дрова писать свои либо юзать те которые позволяют управлять этими пинами.
удачи вам (круглый) ЗЫ Тест можно сделать сделав заглушку данные=пины состояния. Кстати нечто похожее делала программа chekit
Попробуйте протестить LPT компа рабочей программой, написанной на VIZUAL BASIC 6. Программа Test.ехе , код программы и библиотека DLL прилагаю. Библиотека подключается сама при запуске ехе файла, расположенного в той же папке.
Попробуйте протестить LPT компа рабочей программой, написанной на VIZUAL BASIC 6. Программа Test.ехе , код программы и библиотека DLL прилагаю. Библиотека подключается сама при запуске ехе файла, расположенного в той же папке.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения