关于SPCOMM直接读取串口的问题
雨轩居士 2005-08-09 11:25:27 我想实现SPCOMM控件能直接读到串口的功能编写一个函数,实现原理是:先停止线程,执行下面函数
函
function TDriverComm.ReadData(lpNewString: Pchar; dwSizeofNewString: DWORD):DWord;
var
// szInputBuffer: array[0..INPUTBUFFERSIZE-1] of Char;
nNumberOfBytesRead: DWORD;
bResult: boolean;
dwHandleSignaled: DWORD;
dwError: DWORD;
cs: TComStat;
bRead: boolean;
// Needed for overlapped I/O (ReadFile)
overlappedRead: TOverlapped;
//m_csCommunicationSync:_RTL_CRITICAL_SECTION;
// Needed for overlapped Comm Event handling.
// overlappedCommEvent: TOverlapped;
begin
FillChar( overlappedRead, Sizeof(overlappedRead), 0 );
//FillChar( overlappedCommEvent, Sizeof(overlappedCommEvent), 0 );
bRead:=true;
// Lets put an event in the Read overlapped structure.
// if not clearCommError(hcommfile,dwerror,@cs) then
// showmessage('我出错了');
//showmessage(inttostr(cs.cbInQue));
if not ClearCommerror(hcommfile, dwerror,@cs) then
begin
showmessage('clearcommerror');
exit;
end;
overlappedRead.hEvent := CreateEvent( nil, True, true, nil);
if overlappedRead.hEvent = 0 then
begin
// PostHangupCall;
closehandle(overlappedread.hEvent );
exit;
end;
{ if cs.cbInQue=0 then
begin
result:=0;
exit;
end
else
if dwSizeofNewString>cs.cbInQue then
nNumberOfBytesRead:=cs.cbInQue
else
nNumberOfBytesRead:= dwSizeofNewString+2 ; }
lpNewString:=allocmem(dwSizeofNewString) ;
// if WAIT_TIMEOUT=WaitForSingleObject(hCloseEvent,0) then exit;
if bRead then
begin
bResult:=ReadFile(hCommFile,lpNewString^,INPUTBUFFERSIZE,dwsizeofNewString,@overlappedRead);
if not bResult then
begin
dwError:=GetLastError;
Case dwError of
ERROR_IO_PENDING : bRead:=false
else
Raise exception.Create('ReadFile');
end;
end
else
bread:=true;
if not bread then
begin
bread:=true;
bResult:=GetOverlappedResult(hcommFile,overlappedread,dwsizeofnewstring,false);
if not bresult then
raise exception.Create('GetOverlappedresult() in Readfile()');
end;
end;
result:=dwsizeofNewString;
end;
执行完后再恢复线程
但不能正常执行,不能读取串口数据