Win2000下串口通讯问题(100分)

  • 主题发起人 主题发起人 hnzzq
  • 开始时间 开始时间
H

hnzzq

Unregistered / Unconfirmed
GUEST, unregistred user!
在Win2000下只要CreateFile(PChar(FDeviceName), GENERIC_READ or GENERIC_WRITE,0, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED and FILE_ATTRIBUTE_NORMAL,0)
就可以正常通讯,但是有一新问题产生,如果串口没有数据收到的话就不能关闭串口,原因是在等待线程中WaitCommEvent(FHandle, FStatus, @OverlappedCommEvent)这
个语句在串口没有数据收到时不能返回,怎么办?怎么办?????[:(]
 
为什么不用Spcomm试试?
 
写一个线程,在线程中读取串口。

TCommThread = Class(TThread)
protected
procedure Execute;override;
public
InChar : Char;
Protocol : TGPSProtocol;
strPackage : string;
Terminated: Boolean;
constructor Create;
procedure Translate;

end;


procedure TCommThread.Execute;
var
dwErrorFlags,dwLength : DWORD;
ComStat : PComStat;
fReadStat : Boolean;
begin
while Connected do begin
GetMem(ComStat,SizeOf(TComStat));
ClearCommError(CommHandle, dwErrorFlags, ComStat);
if (dwErrorFlags > 0) then begin
PurgeComm(CommHandle,(PURGE_RXABORT and PURGE_RXCLEAR));
// return 0;
end;
dwLength := ComStat.cbInQue;
if (dwLength>0) then begin
fReadStat := ReadFile(CommHandle, InChar, 1,dwLength, nil);
if (fReadStat) then begin
case Protocol of
DATA_STORE : Synchronize(TranslateForXmodem);
GSM : Synchronize(TranslateForGSM);
end
end;
end;//if (fReadStat>0){
end; //if (dwLength>0){
FreeMem(ComStat);
end;{while}
end;
 
你可以自己控制,取消等待事件,WaitCommEvent就会立即返回。
SetCommMask(hCom,0);//取消事件监视,此时监视线程中的WaitCommEvent将返回
 
谢谢各位先,我想问一下在Createfile里的为什么加上"and FILE_ATTRIBUTE_NORMAL"会使等待线程死。
而没有"and FILE_ATTRIBUTE_NORMAL"就不会,这个属性是什么意思。
 
可以用超时来解决。
 
找一个完善的例子看看
比如SPcomm控件的源代码,可以解决你的问题
 
提醒:win2000下,用spcomm,串口书大于com10的话有点问题
 
多人接受答案了。
 

Similar threads

回复
0
查看
848
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
632
import
I
后退
顶部