|
По собственному опыту знаю, что бывает тяжело разобраться в интерфейсе какго-либо
устройства. Поэтому для желающих привожу схему работы с последовательным портом
под полуосью.
открытие последовательного порта
const PortName: PChar = 'COM2';
var
rc: APIRET;
action: ULONG;
fHandle: ULONG;
rc := DosOpen(PortName, fHandle, action, 0, 0, 1, $42, nil);
Если порт открывается нормально, то rc = 0;
закрытие порта
DosClose(fHandle);
запись в порт
var AStr: string; BytesWritten: ULONG:
DosWrite(fHandle, AStr[1], length(AStr), BytesWritten);
чтение из порта
var chBuf: array [1..32] of char; BytesRead: ULONG;
rs:=DosRead (fHandle, chBuf, 32, BytesRead);
установка линии
type TParity = (par_none, par_odd, par_even, par_mark, par_space);
var lctl : LINECONTROL; P: TParity; ADataBits: byte; AStopBits: byte;
lctl.bParity := ord(P);
lctl.bDataBits := ADataBits;
if AStopBits=1 then lctl.bStopBits := 0 else lctl.bStopBits:=2;
lctl.fTransBreak := 0;
DosDevIOCtl (fHandle, IOCTL_ASYNC, ASYNC_SETLINECTRL, @lctl, sizeof (LINECONTROL),
NIL, NIL, 0, NIL)
установка контроля
var dcb : DCBINFO; ARTS_CTS, AXON_XOFF: Boolean;
dcb.usWriteTimeout := 0;
dcb.usReadTimeout := 0;
dcb.fbCtlHndShake := MODE_DTR_CONTROL;
if ARTS_CTS then begin
dcb.fbFlowReplace := MODE_RTS_HANDSHAKE;
dcb.fbCtlHndShake := dcb.fbCtlHndShake + MODE_CTS_HANDSHAKE;
end else dcb.fbFlowReplace := MODE_RTS_CONTROL;
if AXON_XOFF then
dcb.fbFlowReplace := dcb.fbFlowReplace + MODE_AUTO_RECEIVE + MODE_AUTO_TRANSMIT;
dcb.fbTimeout := MODE_NO_WRITE_TIMEOUT + MODE_WAIT_READ_TIMEOUT;
dcb.bErrorReplacementChar := 0;
dcb.bBreakReplacementChar := 0;
dcb.bXONChar := $11;
dcb.bXOFFChar := $13;
DosDevIOCtl (fHandle, IOCTL_ASYNC, ASYNC_SETDCBINFO, @dcb, sizeof (DCBINFO), NIL,
NIL, 0, NIL);
установка RTS
var
ms : MODEMSTATUS;
data : WORD;
res : APIRET;
fRTS: Boolean;
ms.fbModemOn:=0; ms.fbModemOff:=0;
if fRTS then ms.fbModemOn := RTS_ON
else ms.fbModemOff := RTS_OFF;
res:=DosDevIOCtl (fHandle, IOCTL_ASYNC, ASYNC_SETMODEMCTRL, @ms,
sizeof (ms), NIL, @data, sizeof (data), NIL);
установка DTR
var
ms : MODEMSTATUS;
data : WORD;
res : APIRET;
fDTR: Boolean;
ms.fbModemOn:=0;ms.fbModemOff:=0;
if fDTR then ms.fbModemOn := DTR_ON else ms.fbModemOff := DTR_OFF;
res:=DosDevIOCtl (fHandle, IOCTL_ASYNC, ASYNC_SETMODEMCTRL, @ms,
sizeof (ms), NIL, @data, sizeof (data), NIL);
установка скорости
var
par : record
rate : ULONG;
fraction : CHAR;
end;
fBoud: ULong;
par.rate:=fBaud;
par.fraction:=chr(0);
if ((par.rate <= 345600) and (par.rate >= 10)) then
res:=DosDevIOCtl (fHandle, IOCTL_ASYNC, ASYNC_EXTSETBAUDRATE, @par, sizeof (par),
NIL, NIL, 0, NIL);
Написанная мною компонента (основой для которой послужил SerialIO.pas) доступна
для скачивания.
Обсудить материал (число отзывов:1) предыдущий материал | следующий материал |