关于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;
执行完后再恢复线程
但不能正常执行,不能读取串口数据
...全文
267 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
雨轩居士 2005-08-09
  • 打赏
  • 举报
回复
大侠们能不能提供这方面的解决方案,也就是说用一个控件既可以自动读取串口数据,也可以手动读取串口数据,提示更改spcomm代码也可以,现在正急用
雨轩居士 2005-08-09
  • 打赏
  • 举报
回复
是的我是要更改SPCOMM的代码,增加一个读取函数,思路是:在发送数据是先停止线程,用函数读出串口数据,后再恢复止线程,让spcomm来自动读取串口数据
何鲁青 2005-08-09
  • 打赏
  • 举报
回复
没记错的话应该是一个pchar和一个bufferlength才对
雨轩居士 2005-08-09
  • 打赏
  • 举报
回复
我在线等待,怎么才能实现让SPComm手动读取串口,不用事件读取
何鲁青 2005-08-09
  • 打赏
  • 举报
回复
我记得spcomm的接收不是这样的,难道楼主要该的是原码?
hhzqf1980 2005-08-09
  • 打赏
  • 举报
回复
SetLength(s, BufferLength);
Move(Buffer^, pchar(s)^, BufferLength);

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧