下面是一个简单的串口通讯的DLL,我用下面的DLL发一个AT命令到串口线所连接的设备,没有问题,会有OK返回.但是我用下面的DLL发一个AT命令到通过PCMCIA口转串口的设备时,却没有返回的数据了,为什么呢?我百思不得其解,不得不问呀,先谢谢了library CDMA;
uses
sharemem,
DateUtils,
Windows,
SysUtils,
Classes;var
Hcomm:THandle;
inbuffer:array[0..2047] of char;
Comstat:TCOMSTAT;
ErrorMessage:Pchar;
WaitingTime:Integer;
dwError:LongWord;
m_olpRead, m_olpWrite:OVERLAPPED;
{$R *.res}Function CloseComm:Boolean;stdcall;
begin
if (m_olpRead.hEvent <>0) then CloseHandle(m_olpRead.hEvent );
if (m_olpWrite.hEvent <>0) then CloseHandle(m_olpWrite.hEvent );
Result:=Closehandle(hComm);
end;Function GetErrorMessage:Pchar;stdcall;
begin
Result:=ErrorMessage;
end;Function OpenComm(Portno:PChar;BaudRate:Cardinal):Boolean;stdcall;
var
TempConfig:Tcommconfig;
begin
if hComm=0 then
begin
hComm:=Createfile(Portno,GENERIC_READ OR GENERIC_WRITE,0,Nil,OPEN_EXISTING,0,0);
if hComm=INVALID_HANDLE_VALUE then
begin
ErrorMessage:='Open Com port Error!';
Result:=False;
end else
begin
m_olpRead.hEvent := CreateEvent( Nil, TRUE, FALSE, Nil );
m_olpWrite.hEvent := CreateEvent( Nil, TRUE, FALSE, Nil );
GetCommSTATE(hComm,TempConfig.dcb);
TempConfig.dcb.BaudRate :=BaudRate;
if not SetCommState(hComm,TempConfig.dcb ) then
begin
ErrorMessage:='Com port setting Error!';
CloseComm;
Result:=False;
end else
begin
Result:=True;
end;
end;
end else
begin
ErrorMessage:='Com port opened already!';
Result:=False;
end;
end;Function WriteComm(Command:Pchar;Waiting:Integer):Boolean;Stdcall;
var
Written,TempLength:Longword;
begin
if hComm<>0 then
begin
Inbuffer:=''; PurgeComm(hComm, PURGE_TXCLEAR);
TempLength:=Length(Command);
WriteFile(hComm,Command^,Length(Command),Written,nil); if Getlasterror=ERROR_IO_PENDING then ErrorMessage:='ERROR_IO_PENDING'; if Written<>TempLength then
begin
ErrorMessage:='Write data to Com Port Error!';
Result:=False;
end else
begin
WaitingTime:=Waiting;
Result:=True;
end;
end else
begin
ErrorMessage:='Please open Com port first!';
Result:=False;
end;
end;Function ReadComm:Boolean;stdcall;
var
Timebegin,Timeend:Tdatetime;
Bytewaiting1,Bytewaiting2:word;
BytesRead:Longword;
begin
Bytewaiting2:=0;
if hComm<>0 then
begin
TimeBegin:=MilliSecondOf(now);
Timeend:=Timebegin;
While ((TimeEnd-TimeBegin)<waitingtime) do
begin
sleep(10);
ClearcommError(hComm,dwError,@Comstat);
ByteWaiting1:=Comstat.cbInQue ; Sleep(20);
ClearCommError(hComm,dwError,@Comstat);
ByteWaiting2:=Comstat.cbInQue ; Timeend:=MilliSecondOf(now);
if (ByteWaiting1=ByteWaiting2) and (ByteWaiting2<>0) then
begin
Break;
end;
end; if ByteWaiting2=0 then
begin
ErrorMessage:='NO data to read!';
Result:=False;
end else
begin
if Bytewaiting2>sizeof(inbuffer) then
begin
PurgeComm(hComm,Purge_RXCLEAR);
ErrorMessage:='The data is too large to read!';
Result:=False;
end else
begin
if not ReadFile(hComm,inbuffer,Bytewaiting2,BytesRead,nil) then
begin
if Getlasterror=ERROR_IO_PENDING then ErrorrMessage:='ERROR_IO_PENDING';
end;
Result:=True;
end;
end;
end else
begin
ErrorMessage:='Please open Com port first!';
Result:=False;
end;
end;Function ReadSoftWareVersion:Pchar;stdcall;
var
TempCommand:Array[0..20]of char;begin TempCommand:='AT'+#13+#10;
if WriteComm(TempCommand,100) then
begin
if ReadComm then
begin
Result:=Inbuffer;
end else
begin
Result:=ErrorMessage;
end;
end else
begin
Result:=ErrorMessage;
end;
end;
exports
OpenComm,
ReadSoftWareVersion;begin
end.
uses
sharemem,
DateUtils,
Windows,
SysUtils,
Classes;var
Hcomm:THandle;
inbuffer:array[0..2047] of char;
Comstat:TCOMSTAT;
ErrorMessage:Pchar;
WaitingTime:Integer;
dwError:LongWord;
m_olpRead, m_olpWrite:OVERLAPPED;
{$R *.res}Function CloseComm:Boolean;stdcall;
begin
if (m_olpRead.hEvent <>0) then CloseHandle(m_olpRead.hEvent );
if (m_olpWrite.hEvent <>0) then CloseHandle(m_olpWrite.hEvent );
Result:=Closehandle(hComm);
end;Function GetErrorMessage:Pchar;stdcall;
begin
Result:=ErrorMessage;
end;Function OpenComm(Portno:PChar;BaudRate:Cardinal):Boolean;stdcall;
var
TempConfig:Tcommconfig;
begin
if hComm=0 then
begin
hComm:=Createfile(Portno,GENERIC_READ OR GENERIC_WRITE,0,Nil,OPEN_EXISTING,0,0);
if hComm=INVALID_HANDLE_VALUE then
begin
ErrorMessage:='Open Com port Error!';
Result:=False;
end else
begin
m_olpRead.hEvent := CreateEvent( Nil, TRUE, FALSE, Nil );
m_olpWrite.hEvent := CreateEvent( Nil, TRUE, FALSE, Nil );
GetCommSTATE(hComm,TempConfig.dcb);
TempConfig.dcb.BaudRate :=BaudRate;
if not SetCommState(hComm,TempConfig.dcb ) then
begin
ErrorMessage:='Com port setting Error!';
CloseComm;
Result:=False;
end else
begin
Result:=True;
end;
end;
end else
begin
ErrorMessage:='Com port opened already!';
Result:=False;
end;
end;Function WriteComm(Command:Pchar;Waiting:Integer):Boolean;Stdcall;
var
Written,TempLength:Longword;
begin
if hComm<>0 then
begin
Inbuffer:=''; PurgeComm(hComm, PURGE_TXCLEAR);
TempLength:=Length(Command);
WriteFile(hComm,Command^,Length(Command),Written,nil); if Getlasterror=ERROR_IO_PENDING then ErrorMessage:='ERROR_IO_PENDING'; if Written<>TempLength then
begin
ErrorMessage:='Write data to Com Port Error!';
Result:=False;
end else
begin
WaitingTime:=Waiting;
Result:=True;
end;
end else
begin
ErrorMessage:='Please open Com port first!';
Result:=False;
end;
end;Function ReadComm:Boolean;stdcall;
var
Timebegin,Timeend:Tdatetime;
Bytewaiting1,Bytewaiting2:word;
BytesRead:Longword;
begin
Bytewaiting2:=0;
if hComm<>0 then
begin
TimeBegin:=MilliSecondOf(now);
Timeend:=Timebegin;
While ((TimeEnd-TimeBegin)<waitingtime) do
begin
sleep(10);
ClearcommError(hComm,dwError,@Comstat);
ByteWaiting1:=Comstat.cbInQue ; Sleep(20);
ClearCommError(hComm,dwError,@Comstat);
ByteWaiting2:=Comstat.cbInQue ; Timeend:=MilliSecondOf(now);
if (ByteWaiting1=ByteWaiting2) and (ByteWaiting2<>0) then
begin
Break;
end;
end; if ByteWaiting2=0 then
begin
ErrorMessage:='NO data to read!';
Result:=False;
end else
begin
if Bytewaiting2>sizeof(inbuffer) then
begin
PurgeComm(hComm,Purge_RXCLEAR);
ErrorMessage:='The data is too large to read!';
Result:=False;
end else
begin
if not ReadFile(hComm,inbuffer,Bytewaiting2,BytesRead,nil) then
begin
if Getlasterror=ERROR_IO_PENDING then ErrorrMessage:='ERROR_IO_PENDING';
end;
Result:=True;
end;
end;
end else
begin
ErrorMessage:='Please open Com port first!';
Result:=False;
end;
end;Function ReadSoftWareVersion:Pchar;stdcall;
var
TempCommand:Array[0..20]of char;begin TempCommand:='AT'+#13+#10;
if WriteComm(TempCommand,100) then
begin
if ReadComm then
begin
Result:=Inbuffer;
end else
begin
Result:=ErrorMessage;
end;
end else
begin
Result:=ErrorMessage;
end;
end;
exports
OpenComm,
ReadSoftWareVersion;begin
end.
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货