Я одно время тоже мучался с этим, но потом подглядел кое у кого и вот что получилось. Привожу выдержку из своего модуля (если лишние переменные не убрал - спешил, при переваривании "фильтруйте"). Тут все предельно ясно. Надо открыть сначала порт, рекомендую потом прочитать перед использованием. Читать можно в любое время или когда ждете, можно также отправлять в любое время. В конце лучше закрывайте порт. Сталкивался с одной фишкой, юэсбишные ком-переходники не могут быть долго открытыми. С ними чего-то происходит и потом не туда не сюда и не закрывается. А писиай-платой и нормальными портами все работает четко.
При открытии ИК-порта, что-то надо изменить в ComOpen, что сейчас не вспомню. С контролером в режиме RXD-TXD ничего можно не изменять - использовать как есть (не для любителей оптимизировать
![Улыбка](images/smilies/icon_smile.gif)
.
Unit ForCom;
Interface
uses Windows, SysUtils, Forms;
var
TecSPD: DWORD = CBR_9600;
ComError: integer = 0;
mstp: byte = ONESTOPBIT;
mbprt: byte = NOPARITY;
k, b: single;
function ComOpen(Port: string): THandle;
procedure ComClose(var ComHndl: THandle);
procedure ComWrite(ComHndl: THandle; S: string);
function ComRead(ComHndl: THandle): string;
function ErrToStr(i: integer): string;
implementation
var
DataControl: TDCB;
DataWait: TCOMMTIMEOUTS;
st: string[250];
StBUF: array [0..250] of byte absolute st;
MS: array [0..250] of byte;
function ComOpen(Port: string): THandle;
label
ll5, ll6, ll21;
var
Resultf: THandle;
begin
ComError:=0;
Result:=0;
Resultf:=CreateFile(PChar(Port+#0),GENERIC_READ+GE NERIC_WRITE,0,NIL,OPEN_EXISTING,0,0);
if Resultf=INVALID_HANDLE_VALUE then goto ll5;
if GetFileType(Resultf)‹›FILE_TYPE_CHAR then goto ll21;
if not SetupComm(Resultf,$100,$100) then goto ll6;
DataControl.DCBlength:=SizeOf(DataControl);
DataControl.BaudRate:=TecSPD;
DataControl.ByteSize:=5;
DataControl.Parity:=mbprt; //NOPARITY
DataControl.StopBits:=mstp; //ONESTOPBIT;
DataControl.wReserved:=0;
DataControl.XonLim:=0;
DataControl.XoffLim:=0;
DataControl.Flags:=1+16+4096;
DataControl.XonChar:=CHR($11);
DataControl.XoffChar:=CHR($13);
DataControl.ErrorChar:=CHR(0);
DataControl.EofChar:=CHR(0);
DataControl.EvtChar:=CHR(0);
if not SetCommState(Resultf,DataControl) then goto ll6;
DataControl.ByteSize:=8;
if not SetCommState(Resultf,DataControl) then goto ll6;
DataWait.ReadIntervalTimeout:=4294967295;
DataWait.ReadTotalTimeoutMultiplier:=0;
DataWait.ReadTotalTimeoutConstant:=0;
DataWait.WriteTotalTimeoutMultiplier:=1;
DataWait.WriteTotalTimeoutConstant:=0;
if not SetCommTimeouts(Resultf,DataWait) then goto ll6;
if not EscapeCommFunction(Resultf,SETRTS) then goto ll6;
if not EscapeCommFunction(Resultf,SETDTR) then goto ll6;
if not EscapeCommFunction(Resultf,CLRBREAK) then goto ll6;
PurgeComm(Resultf,PURGE_RXCLEAR);
Result:=Resultf;
exit;
ll5:
ComError:=5; {Нельзя открыть COM-порт}
exit;
ll6:
CloseHandle(Resultf);
ComError:=6; {Ошибка установок COM-порта}
exit;
ll21:
CloseHandle(Resultf);
ComError:=21; {Открытый файл не является СОМ-портом}
exit;
end;
procedure ComClose(var ComHndl: THandle);
begin
if ComHndl‹›0 then CloseHandle(ComHndl);
ComHndl:=0;
end;
function ErrToStr(i: integer): string;
begin
case i of
0: ErrToStr:='Порт успешно настроен!';
5: ErrToStr:='Нельзя открыть COM-порт';
6: ErrToStr:='Ошибка установок COM-порта';
7: ErrToStr:='Неправильный ответ';
9: ErrToStr:='Нет ответа';
10: ErrToStr:='Неизвестный прибор';
15: ErrToStr:='Ошибочная длина строки';
16: ErrToStr:='Невозможно записать в COM-порт';
17: ErrToStr:='Досрочное завершение операции'; // DwrdStop‹›0
18: ErrToStr:='Невозможно считать из COM-порта';
21: ErrToStr:='COM-порт не существует';
19: ErrToStr:='Не вce записали в COM-порт';
else ErrToStr:='Неизвестная ошибка '+IntToStr(i);
end;
end;
procedure ComWrite(ComHndl: THandle; S: string);
var
W: DWORD;
Le: DWORD;
begin
ComError:=0;
st:=S;
Le:=length(st);
Application.ProcessMessages;
if Le‹1 then exit;
if not WriteFile(ComHndl, StBUF[1], Le, W, NIL) then ComError:=16;
if W=0 then ComError:=16;
if W‹›Le then ComError:=19;
end;
function ComRead(ComHndl: THandle): string;
var
i, W: DWORD;
st: string;
begin
ComError:=0;
st:='';
Application.ProcessMessages;
if ReadFile(ComHndl, MS, 240, W, NIL) then
if w›=1 then
for i:=0 to W-1 do
st:=st+Chr(MS[i])
else
ComError:=9 {Нет ответа}
else
ComError:=18;
Result:=st;
end;
end.