江湖救急,com读些问题
各位,小弟编写的读取com的函数,在初始化的时候偶尔会有小恙,总是不很稳定,我运行的是win200系统,源代码如下,请帮忙指点一二,小弟不胜感激!
//读取POS函数,返回26位的字符串为有效
function ReadComm: String;
var
Len,number:Cardinal;
buff :Array[1..80] of char;
id : THandle;
dcb : TDCB;
ct : TCOMMTIMEOUTS;
osReader : OVERLAPPED;
i : Integer;
tempchar : char;
begin
Len := 1;
number := 0;
tempchar := '1';
buff[1] := '1';
For i := 2 to 80 do
begin
buff[i] := ' ';
end;
id := CreateFile('COM1',GENERIC_READ or GENERIC_WRITE,0,NIL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if id = null then
begin
Result := '创建或打开COM1出错';
end
else
begin
SetupComm(id,128,512);
PurgeComm(id,PURGE_TXCLEAR or PURGE_RXCLEAR);
if(Not(GetCommState(id,dcb))) then//在这个地方,有时就不正常
begin
CloseHandle(id);
Result := '绑定COM1出错';
end
else
begin
dcb.BaudRate := CBR_19200;
dcb.ByteSize := 8;
dcb.Parity := NOPARITY;
dcb.StopBits := ONESTOPBIT;
if(Not(SetCommState(id,dcb))) then
begin
CloseHandle(id);
Result := '初始化设置出错';
end
else
begin
//设置超时值
ct.ReadIntervalTimeout := MAXDWORD;
ct.ReadTotalTimeoutConstant := 500;
ct.ReadTotalTimeoutMultiplier := 0;
ct.WriteTotalTimeoutConstant := 0;
ct.WriteTotalTimeoutMultiplier := 0;
if(Not(SetCommTimeouts(id,ct))) then
begin
CloseHandle(id);
Result := '设置超时值出错';
end
else
begin
if (not WriteFile(id,tempchar,1,Len,Nil)) then
begin
CloseHandle(id);
Result := 'COM1写出错';
end
else
begin
while ( Length(Trim(buff))<=1 ) do
begin
ReadFile(id,buff,512,len,0);
Sleep(500);
number := number + 1;
if(number>60) then
begin
break;
end;
end;
CloseHandle(id);
if(number>60) then
begin
Result := '刷卡超时出错';
end
else
begin
Result := Copy(buff,1,26);
end;
end;
end;
end;
end;
end;
end;