Delphi中使用API函数进行串口通讯的一些问题,请高手解答(200分)

  • 主题发起人 主题发起人 Junior
  • 开始时间 开始时间
J

Junior

Unregistered / Unconfirmed
GUEST, unregistred user!
小可最近在使用delphi编写一个串口通讯程序时遇到一些问题,百思不得其解,
特向各位大虾求教。
在delphi中调用api函数createfile,writefile,readfile等api函数进行串口通讯,
经常遇到在一端发出的数据另一端收不到的情况。跟踪程序显示问题多出在
getoverlappedresult函数返回false,小可怀疑问题可能处在overlapped的i/o上,这个
createfile函数中指明的overlapped读写方式到底是什么意思?在使用overlapped的
读写方式时有什么要注意的地方吗?我的程序结构大概是这样的,有没有什么问题?
write方法
procedure WriteToComm( BufferToWrite: TCommBuffer;
NumberToWrite: DWORD );
var
dwNumberOfWritten, dwLastError: DWORD;
begin
lpOverlapped^.Offset := 0;
dwNumberOfWritten := 0;
repeat
if not WriteFile( hCommFile, BufferToWrite,
NumberToWrite, dwNumberOfWritten,
lpOverlapped ) then
begin
dwLastError := GetLastError;
if dwLastError <> ERROR_IO_PENDING then
begin
Raise ECommError.Create( 'Error write serial port' );
Exit;
end;

if not GetOverlappedResult( hCommFile, lpOverlapped^,
dwNumberOfWritten, True ) then
begin
Raise ECommError.Create( 'Error write serial port' );
Exit;
end;
end;

Inc( lpOverlapped^.Offset, dwNumberOfWritten );
Dec( NumberToWrite, dwNumberOfWritten );
until (NumberToWrite <= 0);
end;

read方法
procedure ReadFromComm( var BufferToRead: TCommBuffer;
var NumberOfRead: DWORD );
var
dwLastError, dwEvtMask: DWORD;
CommStat: TComStat;
bolOverlappedResult: Boolean;
begin
lpOverlapped^.Offset := 0;
dwEvtMask := 0;
if not ClearCommError( hCommFile, dwLastError, @CommStat ) then
begin
Raise ECommError.Create( 'Error read serial port' );
Exit;
end;

if not WaitCommEvent( hCommFile, dwEvtMask, lpOverlapped ) then
begin
dwLastError := GetLastError;
if dwLastError = ERROR_IO_PENDING then
begin
bolOverlappedResult := GetOverlappedResult( hCommFile,
lpOverlapped^, NumberOfRead, False );
if not bolOverlappedResult then
begin
Exit;
end;
end
else
begin
Exit;
end;
end;

if not ReadFile( hCommFile, BufferToRead,
CommStat.cbInQue, NumberOfRead,
lpOverlapped ) then
begin
Raise ECommError.Create( 'Error read serial port' );
Exit;
end;

if not GetOverlappedResult( hCommFile, lpOverlapped^,
NumberOfRead, True ) then
begin
Raise ECommError.Create( 'Error read serial port' );
Exit;
end;
end;

望各位大虾多多指教,小可这厢有礼了。
 
参考以前串口的程序把,好多。
 
http://cn.ilike.lycosasia.com/soft_con_internet/spcomm_447.html
这个做的不错
多线程的,有源码,你可以看看
 
spcomm的源程序我也看过,好多地方我都是参照那个做的,可是运行起来就是不行啊。有时
调试时可以接受到数据,可运行起来就不行了,救命呐!!!
 
我把问题解决了,是在write和read之间加个sleep(1000)就好了,^0^,不过怎样还是
感谢两位,200分奉上。
 
后退
顶部