Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с Паскалем и выходами на мат. плате(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
Народ, а литература по этому делу(работа с портами, и т.д.) есть?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.