下面是一个简单的串口通讯的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.