Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 04.10.2011, 23:54
Lucky192 Lucky192 вне форума
Прохожий
 
Регистрация: 04.10.2011
Сообщения: 28
Репутация: 1351
По умолчанию

Цитата:
Сообщение от chainik
Привожу драйвер ком- порта для Win95/Win98
К сожалению в WinXP этот трюк уже не работает. Система не допускает прямого обращения к портам ввода/вывода. Это элемент защиты.
У меня на предприятии есть стенды с такой системой. Заменить уже не на что...
Управление аппаратными ресурсами - это основная задача всех многозадачных операционных систем. Неотъемлемой частью такого управления является изоляция программ пользовательского режима от аппаратуры (система не допускает прямого обращения к аппаратной части). Если хотите прямой доступ к аппаратным портам, к памяти, к процессору - становитесь частью ОС, пишите драйвер. Иначе из процессора вытеснят, память кусками выгрузят на диск, а к порту доступа не дадут, т.к. кто-то его уже занял...

Однако не все так плохо, и подобный трюк все-таки работает под XP. Дело в том, что привилегии для кода выполняемого в пользовательском режиме гибко настраиваются. Привилегии процесса задаются табличным способом. К каждому процессу привязан набор таблиц, отвечающих за привилегии, виртуальную память и т.д. В том числе есть и таблица, отвечающая за доступ к портам ввода-вывода (I/O Permission Map). Естественно, что по умолчанию доступ ко всей аппаратуре для приложений закрыт. Также пользовательским приложениям запрещена работа с таблицами привелегий. Но разрешена для драйверов. К счастью, такие драйвера уже давно написаны. Самый простой - это giveio.sys, он дает открывшему его приложению доступ ко всему диапазону портов ввода вывода.

Принцип работы giveio.sys простой:
1. Сначала нужно установить драйвер в систему. Это можно сделать многими способами. Например специальной утилитой (LoadDrv.exe). Еще можно загрузить драйвер прямо из программы, воспользовавшись функциями API. Это достаточно сделать один раз, в дальнейшем драйвер будет загружаться вместе с системой.
2. Нужно подключиться к драйверу giveio.sys. Драйвер обнаружит это подключение и автоматически разрешит доступ ко всем портам для вызывающего процесса. Подключение к драйверу выполняется через функцию CreateFile. В качестве имени файла нужно передать строку '\\.\giveio';
3. Все. Доступ к портам для данного процесса открыт. Можно закрывать хэндл драйвера - доступ сохраниться вплоть до завершения работы процесса.

Есть и другие подобные драйверы. С их помощью, например, можно открыть доступ не ко всем портам, а лишь к определенному диапазону. Или открыть доступ для другого процесса.

Цитата:
Сообщение от chainik
Обрати внимание насколько здесь все проще.
Чтобы отослать байт ты просто отправляешь его в порт
(команды IN/OUT)
Это обманчивая простота. Вот примеры вызова функций WinAPI для замены всех функций модуля Port95:
Код:
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);  // также как и эту
Конечно, нужно еще где-то взять дескриптор h. Но и для Port95 нужно где-то взять адрес порта. Казалось бы чего уж проще - 378h, 278h - вот они (а при использовании WinAPI нужно еще CreateFile с кучей параметров вызывать, ошибки обрабатывать... фу-фу-фу!!!). Ан нет. Вот нужно нам 4 порта использовать. Есть 2 штатных (повезло - а то на новых ведь может и не быть) + ISA карта на 2 порта. Все еще просто? Усложним задачу: [в кабинете начальника] "...а еще чтоб с разными картами работало" (а вдруг карта сгорит а другой такой нет, но есть очень-очень похожая). Еще усложним: [в магазине] "Какие еще ISA-карты? Нету их в продаже и не будет, но в наличии есть PCI ( берите - последняя осталась! ) или PCIExpress или переходник USB-COM. Что будете брать?" (А в WinAPI - вот он я - уже ставлю драйвер для купленного чего-то там, меняю строчку 'COM1' на 'COM18', дописываю еще 10 строк сложного, лишнего, страшного своей бесполезностью кода... Вот-вот завершу переделки! -[ехидно потирает ручки]- )

Еще осталась неохваченной настройка COM-порта. Ее нужно писать самому, в Port95.pas этого нет. Не надеяться же на то, что порт до нас уже кто-то настроил. Какой-то особенной простоты настройки при прямом доступе к портам нет. Будем считать ничья.

Ну и конечно же, мое самое любимое: СКОРОСТЬ!!! Казалось бы - ассемблерные функции. Да там тормозить просто нечему!!! Ан нет и тут засада... Есть такая инструкция OUT. Она-то нам всю малину и испортила. Больно уж долго выполняется (быстрее скорости порта не разгонишься, а это очень медленно даже для систем 20-летней давности). А дальше оптимизировать уже некуда - и так две инструкции. Еще момент: [ситуация] оборудование попалось настырное - шлет и шлет данные непрерывным потоком на полной скорости. Скорость приема байт хоть и небольшая (каких-то 10 кГц всего), но и квант времени в системе немаленький - 18 миллисекунд. Кто-то процессор занял чуть дольше положенного - и PortReadByte не выполнялся в течении 10 мс. Хорошо что есть буфер FIFO! Целых 16 байт. На 16 мс. Мда, уже не хватает - могут быть потери данных (вот она проклятая многозадачность где боком вылезла) - надо что-то думать... А в WinAPI - дописал 100 строк сложного кода и у тебя как-то все само-собой в буфере появляется - успевай только обрабатывать.

Последний раз редактировалось Lucky192, 05.10.2011 в 04:30.
Ответить с цитированием
  #17  
Старый 05.10.2011, 01:24
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

благодарю за отличную статью.
прочитал с большим интересом.
я собственно привел этот пример только чтобы продемонстрировать
2 подхода-прямой доступ к портам (win95) и доступ через файл (WinXP)
Когда речь идет о чисто техническом применении то как правило скорости хватает с избытком, хотя риск потерятьинформацию остается.
Мы решали эту проблему передачей контрольной суммы. Если не совпала- то повторная передача пакета.
В итоге у нас до сих пор работают машины Win98. И даже (страшно сказать) DOS! И процессор 86! между прочим с работой справляются. Да и заморачиваться с многозадачностью не надо.
Переписапь ПО- руки не доходят. Да и смысла копаться в старье нет.

Однако мы увлеклись теорией, а ведь человеку надо зачет получить...

Последний раз редактировалось chainik, 05.10.2011 в 01:51.
Ответить с цитированием
  #18  
Старый 05.10.2011, 03:20
Alexander-VS Alexander-VS вне форума
Прохожий
 
Регистрация: 05.10.2011
Сообщения: 1
Репутация: 10
По умолчанию Драйвер

Я дико извиняюсь, я только учусь, но не могу найти giveio.sys
Ответить с цитированием
  #19  
Старый 05.10.2011, 04:19
Lucky192 Lucky192 вне форума
Прохожий
 
Регистрация: 04.10.2011
Сообщения: 28
Репутация: 1351
По умолчанию

Сохранился у меня с незапамятных времен оригинал проекта giveio.sys, вот ссылка на скачивание: http://files.mail.ru/EKHU7T

Если посмотрите исходник драйвера, там есть функция:
Код:
VOID SetIOPermissionMap(int OnFlag)
{
	Ke386IoSetAccessProcess(PsGetCurrentProcess(), OnFlag);
	Ke386SetIoAccessMap(1, IOPM_local);
}
Вот она как раз и открывает приложению доступ к портам. Драйвер нужен, чтобы вызвать функции Ke386... - это функции ядра, приложениям они не доступны.

В архиве есть программа для инсталляции драйвера.

Функция для загрузки драйвера:
Код:
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  
Старый 05.10.2011, 18:36
devochka devochka вне форума
Прохожий
 
Регистрация: 02.11.2010
Сообщения: 31
Репутация: 10
По умолчанию

Спасибо вам мальчики большое очень помогли!!! Про линии я действительно не понимала!!! Большое спасибо за статью))))

Но если я все правильно поняла для управления несколькими элементами нужно что то типа переключающего устройства, подключенного к выходу порта и далее на эти элементики???
Ответить с цитированием
  #21  
Старый 05.10.2011, 20:07
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

можно так.
Есть устройства- переключатели СОМ-портов
Но лучше каждым устройством управлять со своего СОМ-порта.
А вообще-то эта техника отживает свое. ЕЕ вытесняет USB.
Вот к одному порту USB действительно можно подключить много (около 250, точно не помню) устройств.
СОМ остался только в промышленных системах управления/сбора информации. В новых компьютерах их вообще перестали делать.
Так что бросай эту тему и берись за изучение USB. Заниматься надо передовыми технологиями.
Посмотри в сторону распределенных систем сбора информации (модули ADAM). Пригодится при написании диплома.
Ответить с цитированием
  #22  
Старый 07.10.2011, 12:25
devochka devochka вне форума
Прохожий
 
Регистрация: 02.11.2010
Сообщения: 31
Репутация: 10
По умолчанию

Я с тобой согласна что это прошлый век но я не могу же отказаться от задания!!!!((((((
Ответить с цитированием
  #23  
Старый 17.10.2011, 19:00
Аватар для lazudhic
lazudhic lazudhic вне форума
Прохожий
 
Регистрация: 01.08.2010
Сообщения: 4
Репутация: 10
По умолчанию

маленький пример программы для 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  
Старый 17.10.2011, 19:04
Аватар для lazudhic
lazudhic lazudhic вне форума
Прохожий
 
Регистрация: 01.08.2010
Сообщения: 4
Репутация: 10
По умолчанию

да к стати надеюсь ты знаешь какие контакты СОМ порта выходы какие входы
Ответить с цитированием
  #25  
Старый 18.10.2011, 05:23
devochka devochka вне форума
Прохожий
 
Регистрация: 02.11.2010
Сообщения: 31
Репутация: 10
По умолчанию

Да знаю!)с лпт я уже давно разобралась,сейчас ищу мальчика который бв мне коммутационный прибор собрал)))))
Ответить с цитированием
  #26  
Старый 15.11.2011, 10:36
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от devochka
Ребята такая проблема: Делаю курсовую на тему Управление внешними устройствами ......... Задание такое нужно написать программу которая бы управляла при помощи СОМ- порта каким либо простейшим устройством!!!

Может кто-то еще захочет поуправлять устройствами с компьютера

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  
Старый 15.11.2011, 11:33
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Вот был бы модуль с Ethernet и высоковольтными релюшками - присобачил бы под "умный дом", чтобы при поступлении сигнала с IP-камеры (с микрофоном), например, по хлопку или по движению (ну, можно даже в зависимости от времени суток) включался/выключался свет А так... Не, по USB тоже как вариант, но портов лишних нет, на и большинство компов на линуксе. Лениво костыли прикручивать
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #28  
Старый 15.11.2011, 12:11
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от DJ PhoeniX
но портов лишних нет
?usb hub?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #29  
Старый 17.11.2011, 09:49
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Цитата:
Сообщение от devochka
Да знаю!)с лпт я уже давно разобралась,сейчас ищу мальчика который бв мне коммутационный прибор собрал)))))

Я вот тут сделал "коммутационный прибор"
Использует 12 COM портов
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:14.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter