|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Работа с LPT портом
Нужно сделать программу для передачиданных в lpt и чтения с него. Пробовал использовать драйвера такие как giveio.sys и inpout32.dll. Сразу скажу что результат одинаковый поэтому буду приводить на примере inpout32.dll. Библиотека работает но не так как мне нужно. Я сделал маленькую тестовую программку и обнаружил следующее при ее работе: максимальная частота передачи данных на LPT примерно 50 Гц. А мне нужно 3-5 кГц
Я использовал таймер на вызов функции передачи данных в порт. В программке есть SpinEdit и он управляет интервалом таймера. Так вот: при изменении значения spinedit я заметил что регулировка выходной частоты на порте производится ступеньками, тоесть изменения частоты вступают в силу только при изменении интервала на 15-20 делений. (может проблема в таймере?) Но я пробовал и без таймера. Просто цыкл, даже без задержек чтоб получить максимальную частоту на выходе порта. Получил теже 50 Гц только с менее стабильной частотой. Работаю с портом под ХР. У меня есть уже готовая программка которая выдает под ХР на порт даже 10 кГц но проблема в том что я незнаю через какой она драйвер работает и она меня не устраивает по функционалу. Может приложению нужно установить привелегии? Скажите, как мне решить проблему... З.Ы. Если нужно - могу выложить исходник своей тестовой программки, она маленькая |
#2
|
||||
|
||||
а если попробовать без библиотек м.б. в них что-то не то при работе в WinXP с каким-либо сервис паком или так может что-то проясниться
|
#3
|
|||
|
|||
А если попробовать без LPT? Я так понял, что связь не с принтером? (У нас CAN была настроена на 125Кбод. Хотя можно было и увеличить скорость. Переходники есть через USB и Ethernet).
Последний раз редактировалось AlexSku, 04.03.2012 в 19:34. |
#4
|
||||
|
||||
Нет, нужен именно LPT. Хотя в программе будет поддерживатся еще и USB. Но сейчас вопрос стоит только для LPT. Это для станков ЧПУ и большинство станков работают именно по LPT. Поэтому и скорость нужна большая (для шаговых двигателей) и стабильная регулировка частот на выходе порта.
Насчет работы с портом через файл если честно немного не понял. Обьясните кто знает. Вот исходник: Код:
var Form1: TForm1; hLPT: THandle; Data: byte; Data2: byte; ret: DWORD; Address: byte; const IOCTL_PAR_SET_WRITE_ADDRESS = $16001C; Далее процедура при нажатии на кнопку: Address := $AA; hLpt := CreateFile('LPT1', GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0); DeviceIoControl(hLpt, IOCTL_PAR_SET_WRITE_ADDRESS, @Address, 1, nil, 0, ret, nil); // Запись writefile(hlpt, [$55], 1, ret, nil); // Чтение по адресу ReadFile(hLPT, Data2, 1, ret, nil); Panel1.Caption := inttostr(data2); CloseHandle(hLpt); Обьясните для чайника где адрес порта? Если это переменная address то почему ее значение $AA? Это же не лпт порт... Пробовал вместо $AA писать 888 и $378, кидал туда самые разные данные но на выходе порта ничего не происходило. Что я делаю нетак? |
#5
|
||||||
|
||||||
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
фактически адрес порта это и есть его хэндл, по другому как-то понять Цитата:
как-то так Последний раз редактировалось cotseec, 05.03.2012 в 00:24. |
#6
|
||||
|
||||
Спасибо, уже понял. Но почемуже тогда на порт ничего не выходит? на пинах нет изменения и при чтении выдает зеро
|
#7
|
||||
|
||||
Если по аналогии с СОМ портом...
прочитаем что-то с порта только если на порт что-то ответило подключенное устройство, в противном случае - нуль если вы пытаетесь посмотреть изменение на контактах порта в процессе работы рассмотренной ранее процедуры, то по идее просто не успеете (открыли порт, настроили, что-то отослали, закрыли) - доли секунды по одной кнопке открывайте и отправляйте, а по другой - закрывайте порт, смотрите изменение между нажатиями на кнопки (т.е. до закрытия порта, пока хендл порта не уничтожен), как-то так, что-то иное предложить пока не очень |
#8
|
||||
|
||||
Могу скинуть мой пример, он переключал светодиоды, но, в принципе, предназначалса для тех же самых целей. Делал давно, сор за украинский интерфейс) еще на 2м курсе универа. Для работы нужен драйвер lptwdmio.sys (есть в папке с проектом, пусть там и остается). Так же есть возможность принимать и входные сигналы, здесь не реализированно.
Весь мануал и примеры тогда взялздесь Последний раз редактировалось YVitaliy, 05.03.2012 в 23:50. |