Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с Паскалем и выходами на мат. плате(com, Usb...)
Форум «Всё о Паскале» > Pascal, Object Pascal > Теоретические вопросы
necks
Посколько в Паскале новичок хотел помимо написания обычных программ научиться програмировать устроиства подключенные к портам вывода. В разделе "статьи" прочитал о програмировании мыши, и поэтому еще больше заинтересовался эти вопросом.

Так вот раз подфорум теоритический, то при помощи каких функций можно осуществить обращение к портам.
Романтик
точнее можешь???
GoodWind
James_Bond, вроде вполне точно сформулирован вопрос: Как в паскале работать с com, lpt и usb?
xds
necks, желательно точно определиться, какой интерфейс (COM, LPT или USB) и в какой среде (DOS или Win32) ты собираешься программировать, т. к. методы программирования значительно отличаются.
necks
Скорее всего буду програмировать в Win32. А вот то какой интерфейс пока не знаю, серьезно интерес к этому появился недавно, поэтому раз форум по Паскалю, значит и люди которые здесь сидят разбираются в этом, а я только новичок можно сказать. Так вот, мне бы больше теории узнать на первое время...
xds
В Win32 проще всего работать с COM:
- не нужно писать драйвер - используются функции файлового ввода-вывода и несколько специальных функций, т. е. работа только с Win32 API;
- легко реализуется в подключаемом устройстве (если последнее необходимо изготовить самому).
necks
Ну а с помощью каких функций/команд можно програмировать порт? smile.gif
xds
Открытие порта:
var
Port: THANDLE;
...
Port := CreateFile(
'COM1',
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
0,
0
);


Закрытие:
  CloseHandle(Port);


Установка параметров соединения: скорости передачи данных, формата фрейма и способа управления потоком данных:
var
dcb: TDCB;
...
dcb.DCBlength := SizeOf(dcb);
GetCommState(Port, dcb);
dcb.BaudRate := CBR_9600;
dcb.ByteSize := 8;
dcb.Parity := EVENPARITY;
dcb.StopBits := 2;
dcb.Flags :=
fBinary
or fParity
or fOutDsrFlow
or fOutCtsFlow
or fDtrControl * DTR_CONTROL_ENABLE
or fRtsControl * RTS_CONTROL_ENABLE;
SetCommState(Port, dcb);


Настройка тайм-аутов передачи данных:
var
ct: TCOMMTIMEOUTS;
...
ct.ReadIntervalTimeout := 1000;
ct.ReadTotalTimeoutMultiplier := 0;
ct.ReadTotalTimeoutConstant := 0;
ct.WriteTotalTimeoutMultiplier := 0;
ct.WriteTotalTimeoutConstant := 5000;
SetCommTimeouts(Port, ct);


Чтение данных (Buf - переменная - буфер, в который принимаются данные; Count - кол-во байт, которое необходимо принять; r получает кол-во принятых байт, r < Count в случае ошибки):
  WriteFile(Port, Buf, Count, r, nil);


Запись данных (Buf - переменная - буфер с данными; Count - кол-во байт в буфере; r получает кол-во переданных байт, r < Count в случае ошибки):
    WriteFile(Port, Buf, Count, r, nil);


P. S. Естественно, во всех случаях необходимо выполнять проверку на наличие ошибок ;) (все перечисленные функции, за исключением CreateFile, возвращают значения типа Boolean; CreateFile в случае ошибки возвращает значение INVALID_HANDLE_VALUE).
necks
Ок, большое спасибо - буду пробовать. А для usb порта есть наверняка команды?
xds
Под USB-устройства обычно пишут свой драйвер.
Dr.Bugy
Вот модули для работы с USB пртом, может пригодятся.
AstonClinton
Народ, а литература по этому делу(работа с портами, и т.д.) есть?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.