|
#16
|
|||
|
|||
Цитата:
Однако не все так плохо, и подобный трюк все-таки работает под XP. Дело в том, что привилегии для кода выполняемого в пользовательском режиме гибко настраиваются. Привилегии процесса задаются табличным способом. К каждому процессу привязан набор таблиц, отвечающих за привилегии, виртуальную память и т.д. В том числе есть и таблица, отвечающая за доступ к портам ввода-вывода (I/O Permission Map). Естественно, что по умолчанию доступ ко всей аппаратуре для приложений закрыт. Также пользовательским приложениям запрещена работа с таблицами привелегий. Но разрешена для драйверов. К счастью, такие драйвера уже давно написаны. Самый простой - это giveio.sys, он дает открывшему его приложению доступ ко всему диапазону портов ввода вывода. Принцип работы giveio.sys простой: 1. Сначала нужно установить драйвер в систему. Это можно сделать многими способами. Например специальной утилитой (LoadDrv.exe). Еще можно загрузить драйвер прямо из программы, воспользовавшись функциями API. Это достаточно сделать один раз, в дальнейшем драйвер будет загружаться вместе с системой. 2. Нужно подключиться к драйверу giveio.sys. Драйвер обнаружит это подключение и автоматически разрешит доступ ко всем портам для вызывающего процесса. Подключение к драйверу выполняется через функцию CreateFile. В качестве имени файла нужно передать строку '\\.\giveio'; 3. Все. Доступ к портам для данного процесса открыт. Можно закрывать хэндл драйвера - доступ сохраниться вплоть до завершения работы процесса. Есть и другие подобные драйверы. С их помощью, например, можно открыть доступ не ко всем портам, а лишь к определенному диапазону. Или открыть доступ для другого процесса. Цитата:
Код:
ReadFile(h,ByteValue,1,tmp,nil); // function PortReadByte(Addr:Word):Byte; ReadFile(h,WordValue,2,tmp,nil); // function PortReadWord(Addr:Word) : Word; ReadFile(h,WordValue,2,tmp,nil); // function PortReadWordLS(Addr:Word) : Word; WriteFile(h,ByteValue,1,tmp,nil); // procedure PortWriteByte(Addr:Word; Value:Byte); WriteFile(h,WordValue,2,tmp,nil); // procedure PortWriteWord(Addr:Word; Value:Word); WriteFile(h,WordValue,2,tmp,nil); // procedure PortWriteWordLS(Addr:Word; Value:Word) ReadFile(h,IntValue,4,tmp,nil); // А такую функцию в Port95 еще добавлять надо ;) WriteFile(h,IntValue,4,tmp,nil); // также как и эту Еще осталась неохваченной настройка COM-порта. Ее нужно писать самому, в Port95.pas этого нет. Не надеяться же на то, что порт до нас уже кто-то настроил. Какой-то особенной простоты настройки при прямом доступе к портам нет. Будем считать ничья. Ну и конечно же, мое самое любимое: СКОРОСТЬ!!! Казалось бы - ассемблерные функции. Да там тормозить просто нечему!!! Ан нет и тут засада... Есть такая инструкция OUT. Она-то нам всю малину и испортила. Больно уж долго выполняется (быстрее скорости порта не разгонишься, а это очень медленно даже для систем 20-летней давности). А дальше оптимизировать уже некуда - и так две инструкции. Еще момент: [ситуация] оборудование попалось настырное - шлет и шлет данные непрерывным потоком на полной скорости. Скорость приема байт хоть и небольшая (каких-то 10 кГц всего), но и квант времени в системе немаленький - 18 миллисекунд. Кто-то процессор занял чуть дольше положенного - и PortReadByte не выполнялся в течении 10 мс. Хорошо что есть буфер FIFO! Целых 16 байт. На 16 мс. Мда, уже не хватает - могут быть потери данных (вот она проклятая многозадачность где боком вылезла) - надо что-то думать... А в WinAPI - дописал 100 строк сложного кода и у тебя как-то все само-собой в буфере появляется - успевай только обрабатывать. Последний раз редактировалось Lucky192, 05.10.2011 в 04:30. |
#17
|
|||
|
|||
благодарю за отличную статью.
прочитал с большим интересом. я собственно привел этот пример только чтобы продемонстрировать 2 подхода-прямой доступ к портам (win95) и доступ через файл (WinXP) Когда речь идет о чисто техническом применении то как правило скорости хватает с избытком, хотя риск потерятьинформацию остается. Мы решали эту проблему передачей контрольной суммы. Если не совпала- то повторная передача пакета. В итоге у нас до сих пор работают машины Win98. И даже (страшно сказать) DOS! И процессор 86! между прочим с работой справляются. Да и заморачиваться с многозадачностью не надо. Переписапь ПО- руки не доходят. Да и смысла копаться в старье нет. Однако мы увлеклись теорией, а ведь человеку надо зачет получить... Последний раз редактировалось chainik, 05.10.2011 в 01:51. |
#18
|
|||
|
|||
Драйвер
Я дико извиняюсь, я только учусь, но не могу найти giveio.sys
|
#19
|
|||
|
|||
Сохранился у меня с незапамятных времен оригинал проекта giveio.sys, вот ссылка на скачивание: http://files.mail.ru/EKHU7T
Если посмотрите исходник драйвера, там есть функция: Код:
VOID SetIOPermissionMap(int OnFlag) { Ke386IoSetAccessProcess(PsGetCurrentProcess(), OnFlag); Ke386SetIoAccessMap(1, IOPM_local); } В архиве есть программа для инсталляции драйвера. Функция для загрузки драйвера: Код:
function LoadGiveIO:boolean; var DriverHandle:integer; begin Result:=false; DriverHandle:=CreateFile('\\.\giveio', GENERIC_READ, 0, NIL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (DriverHandle<>INVALID_HANDLE_VALUE) then begin Result:=true; CloseHandle(DriverHandle); end; end; Но, повторяю: работать с COM-портами под Windows через стандартные WinApi-функции не сложнее (и, что самое главное - корректнее) чем через прямой доступ. Вот минимальная программа, которая будет работать если порт доступен: Код:
uses Windows; ... var h,t:cardinal; ... h:=CreateFile('COM1',GENERIC_READ+GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0); WriteFile(h,'Hello World!',12,t,nil); CloseHandle(h); |
#20
|
|||
|
|||
Спасибо вам мальчики большое очень помогли!!! Про линии я действительно не понимала!!! Большое спасибо за статью))))
Но если я все правильно поняла для управления несколькими элементами нужно что то типа переключающего устройства, подключенного к выходу порта и далее на эти элементики??? |
#21
|
|||
|
|||
можно так.
Есть устройства- переключатели СОМ-портов Но лучше каждым устройством управлять со своего СОМ-порта. А вообще-то эта техника отживает свое. ЕЕ вытесняет USB. Вот к одному порту USB действительно можно подключить много (около 250, точно не помню) устройств. СОМ остался только в промышленных системах управления/сбора информации. В новых компьютерах их вообще перестали делать. Так что бросай эту тему и берись за изучение USB. Заниматься надо передовыми технологиями. Посмотри в сторону распределенных систем сбора информации (модули ADAM). Пригодится при написании диплома. |
#22
|
|||
|
|||
Я с тобой согласна что это прошлый век но я не могу же отказаться от задания!!!!((((((
|
#23
|
||||
|
||||
маленький пример программы для LPT может что пригодится но необходимо мне было использовать DLL
Код:
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function Inp32(PortAdr: word): byte; stdcall; external 'inpout32.dll'; function Out32(PortAdr: word; Data: byte): byte; stdcall; external 'inpout32.dll'; \\вот та DLL procedure TForm1.Button1Click(Sender: TObject); var i : Integer; begin for i := 1 to 400 do begin out32(888,17);\\номер порта LPT 888, номер контакта out32(888,19); sleep(1);\\ без паузы не работала пришлось вставить out32(888,18); out32(888,22); sleep(1); out32(888,20); out32(888,28); sleep(1); out32(888,24); out32(888,25); sleep(1); end; end; end. с контактами надеюсь ты разобрался к примеру чтоб на 1 подать ставим цифру 1, на второй 2, на третий 4 а чтоб одновременно на первый и третий 5 Последний раз редактировалось Admin, 17.10.2011 в 20:51. |
#24
|
||||
|
||||
да к стати надеюсь ты знаешь какие контакты СОМ порта выходы какие входы
|
#25
|
|||
|
|||
Да знаю!)с лпт я уже давно разобралась,сейчас ищу мальчика который бв мне коммутационный прибор собрал)))))
|
#26
|
||||
|
||||
Цитата:
Может кто-то еще захочет поуправлять устройствами с компьютера USB модуль Ke-USB24A Линии ввода/вывода: 24 штуки АЦП: 1 штука (10 бит) Описание: Модуль Ke-USB24A предназначен для сопряжения внешних цифровых и аналоговых устройств, датчиков и исполнительных механизмов с компьютером через шину USB. Определяется как дополнительный (виртуальный) COM порт. Модуль имеет 24 дискретные линии ввода/вывода (либо лог. 0 либо лог. 1) с возможностью настройки направления передачи данных (вход/выход) и встроенный 10-ти разрядный АЦП. Для управления модулем предусмотрен набор текстовых команд управления (KE - команды). USB модуль Ke-USB24R Линии ввода/вывода: 18 штук Реле: 4 штуки АЦП: 4 штуки Описание: Модуль Ke-USB24R предназначен для сопряжения внешних цифровых и аналоговых устройств, датчиков и исполнительных механизмов с компьютером через шину USB. Имеет в совем составе четыре мощных реле для управления высоковольтными цепями и нагрузками. Определяется как дополнительный (виртуальный) COM порт. Модуль имеет 18 дискретных линии ввода/вывода (либо лог. 0, либо лог. 1) с возможностью настройки направления передачи данных (вход/выход) и 4 встроенных 10-ти разрядных АЦП. Для управления модулем предусмотрен набор текстовых команд управления (KE - команды). Ethernet модуль Jerome Jerome Ethernet модуль для управления внешними цепями / нагрузками и мониторинга / измерения различных параметров (напряжение, температура и т.д.) по локательной сети (LAN). Линии ввода/вывода: 22 штуки АЦП: 4 штуки Счетчик импульсов: 4 штуки ШИМ выход, USART Web-интерфейс управления Командный интерфейс по TCP/IP Описание: Модуль Jerome предназначен для управления внешними цепями/нагрузками и мониторинга / измерения различных параметров (напряжение, температура и т.д.). Главной особенностью Jerome является поддержка Ethernet. Это означает что модулем можно управлять по сетевому кабелю (витой паре). Это позволяет размещать модуль на значительном расстоянии от управляющего компьютера (сотни метров). Управление осуществляеся набором текстовых команд управления по TCP/IP протоколу или через встроенный Web-интерфейс. Модуль имеет встроенную Web-страницу управления. Достаточно запустить любой браузер, ввести IP адрес модуля (по умолчанию 192.168.0.101) и вы получаете удобный визуализирован ный интерфейс для управления различными ресурсами модуля и мониторинга его параметров в режиме реального времени. Есть и другие интересные приборы Пишу программы за еду. __________________ |
#27
|
||||
|
||||
Вот был бы модуль с Ethernet и высоковольтными релюшками - присобачил бы под "умный дом", чтобы при поступлении сигнала с IP-камеры (с микрофоном), например, по хлопку или по движению (ну, можно даже в зависимости от времени суток) включался/выключался свет А так... Не, по USB тоже как вариант, но портов лишних нет, на и большинство компов на линуксе. Лениво костыли прикручивать
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#28
|
||||
|
||||
Цитата:
Пишу программы за еду. __________________ |
#29
|
||||
|
||||
Цитата:
Я вот тут сделал "коммутационный прибор" Использует 12 COM портов Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |