procedure TForm1.Button1Click(Sender: TObject);
var
  hCom:THandle;
  Timeout:TCommTimeouts;
  Dataout,Datain:pchar;
  Overlapped:POverlapped;
  BufferSize:DWORD;
begin
  hcom:=CreateFile('Com3',
    GENERIC_READ or GENERIC_WRITE,
                    0,
                    nil,
                    OPEN_EXISTING,
                    FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,
                    0);
  Timeout.ReadIntervalTimeout:=10;
  Timeout.ReadTotalTimeoutMultiplier:=20;
  Timeout.ReadTotalTimeoutConstant:=30;
  SetCommTimeouts(hCom,Timeout);
  SetEvent(hCom);  Dataout:='S';
  GetMem(overlapped,sizeof(TOverlapped));
  BufferSize:=4096;
  GetMem(Datain,4096); if WriteFile(hCom,Dataout,1,BufferSize,Overlapped) then
    showmessage('Write Right');
  if ReadFile(hCom,Datain,1,BufferSize,Overlapped) then
    showmessage('Read Right');  //showmessage(string(Datain));  FreeMem(Datain);
  FreeMem(Overlapped);
  Closehandle(hCom);
end;上面的代码应该是发送一字符,读取一个字符,上面的代码能否正确执行,得到想要的结果,这个代码我找来的。

解决方案 »

  1.   

    就是,Datain算什么东西,接收上来的码?,不管Dataout为多少它的值都一样
    showmessage(string(Datain));
    不知道这样发送接接收对不对啊。哪位有人帮忙看看
      

  2.   

    http://expert.csdn.net/Expert/topic/1669/1669798.xml?temp=.5736963
    一样的错吧
    WriteFile(hCom,Dataout^,1,BufferSize,Overlapped)
      

  3.   

    不是啊,我的是串口问题,用的是API函数WriteFile和ReadFile,而你给的是Delphi本身的函数FileRead,应该不是这个原因吧。
      

  4.   

    好多问题:
    1 串口没有设置SetCommState,PurgeComm,SetupComm,SetCommTimeouts
    2 没有设置WriteTotalTimeOutXXX,且ReadTotalTimeoutConstant太小
    3 TOverlapped没有清0
    4 没有检查WriteFile和ReadFile的返回值,返回False时要用GetOverlappedResult获得实际读写的字节数,如果等于要读写的字节数,也要认为成功
      

  5.   

    好不容易才找到一个N年前些的控件,给你参考参考,分可不能少 :)unit SNCOMM;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;type
      TSNCOMM = class(TComponent)
      private
        { Private declarations }
        FPortName:   String;
        FComHandle: THandle;
      protected
        { Protected declarations }
      public
        { Public declarations }
        constructor Create(AOwner: TComponent); override;
        destructor Destroy; override;
        function Connect(ComPort: Byte; bps: Cardinal): Boolean;
        procedure Disconnect;
        function Read(var Buff; Bytes: Cardinal): Cardinal;
        function Write(var Buff; Bytes: Cardinal): Cardinal;
        function ReadByte(var B: Byte): Boolean;
        function SendByte(B: Byte): Boolean;
        function WriteByte(B: Byte): Boolean;
        procedure Clear;
        function BytesNeedRead: Cardinal;
        function Connected: Boolean;
        procedure FlushBuffers(Rx,Tx: Boolean);    property PortName: String read FPortName;
      published
        { Published declarations }
      end;procedure Register;implementationprocedure Register;
    begin
      RegisterComponents('Standard', [TSNCOMM]);
    end;{ TSNCOMM }function TSNCOMM.BytesNeedRead: Cardinal;
    var
      err: Cardinal;
      cs: TCOMSTAT;
    begin
      Result := 0;
      if not Connected then Exit;
      if not ClearCommError(FComHandle,err,@cs) then Exit;
      Result := cs.cbInQue;
    end;procedure TSNCOMM.Clear;
    begin
      if not Connected then Exit;
      PurgeComm(FComHandle,PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR);
    end;function TSNCOMM.Connect(ComPort: Byte; bps: Cardinal): Boolean;
    var
      dcb: TDCB;
      tos: TCOMMTIMEOUTS;
      n: Cardinal;
    begin
      Result := False;
      if Connected then Exit;  case bps of
        110:    n := CBR_110;
        300:    n := CBR_300;
        600:    n := CBR_600;
        1200:   n := CBR_1200;
        2400:   n := CBR_2400;
        4800:   n := CBR_4800;
        9600:   n := CBR_9600;
        14400:  n := CBR_14400;
        19200:  n := CBR_19200;
        38400:  n := CBR_38400;
        56000:  n := CBR_56000;
        57600:  n := CBR_57600;
        115200: n := CBR_115200;
        128000: n := CBR_128000;
        256000: n := CBR_256000;
        else    Exit;
      end;  FPortName := Format('COM%d',[ComPort]);
      FComHandle := CreateFile( PChar(FPortName),
                                GENERIC_READ or GENERIC_WRITE,
                                0, // Not shared
                                nil, // No security attributes
                                OPEN_EXISTING,
                                FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,
                                0 // No template
                              ) ;
      if Connected then
      begin
        FillChar( dcb, SizeOf(dcb), 0 );
        dcb.DCBLength := sizeof(dcb);
        dcb.BaudRate := n;
        dcb.Flags := 1; { binary mode }
        dcb.ByteSize := 8;
        dcb.Parity := 0;
        dcb.StopBits := 0;    tos.ReadIntervalTimeout := 100;
        tos.ReadTotalTimeoutMultiplier := 100;
        tos.ReadTotalTimeoutConstant := 1000;
        tos.WriteTotalTimeoutMultiplier := 100;
        tos.WriteTotalTimeoutConstant := 1000;    Result := True;    if SetCommState( FComHandle, dcb )
           and PurgeComm( FComHandle, PURGE_TXABORT or PURGE_TXCLEAR or PURGE_RXABORT or PURGE_RXCLEAR )
           and SetupComm( FComHandle, 100, 100 )
           and SetCommTimeouts( FComHandle, tos )
           then Exit;    Disconnect;
        Result := False;
      end;  FPortName := '';
    end;function TSNCOMM.Connected: Boolean;
    begin
      Result := FComHandle <> INVALID_HANDLE_VALUE;
    end;constructor TSNCOMM.Create(AOwner: TComponent);
    begin
      inherited;
      FComHandle := INVALID_HANDLE_VALUE;
    end;destructor TSNCOMM.Destroy;
    begin
      Disconnect;
      inherited;
    end;procedure TSNCOMM.Disconnect;
    begin
      if Connected then
      begin
        CloseHandle(FComHandle);
        FComHandle := INVALID_HANDLE_VALUE;
      end;
    end;procedure TSNCOMM.FlushBuffers(Rx, Tx: Boolean);
    var
      Flag: Cardinal;
    begin
      if not Connected then Exit;
      Flag := 0;
      if Rx then Flag := Flag or PURGE_RXABORT or PURGE_RXCLEAR;
      if Tx then Flag := Flag or PURGE_TXABORT or PURGE_TXCLEAR;
      if Flag <> 0 then PurgeComm(FComHandle,Flag);
    end;function TSNCOMM.Read(var Buff; Bytes: Cardinal): Cardinal;
    var
      ol: TOVERLAPPED;
    begin
      Result := 0;
      if not Connected then Exit;  FillChar(ol,SizeOf(ol),0);
      if not ReadFile(FComHandle,Buff,Bytes,Result,@ol) then
        GetOverlappedResult(FComHandle,ol,Result,True);
    end;function TSNCOMM.ReadByte(var B: Byte): Boolean;
    begin
      Result := Read(B,1) = 1;
    end;function TSNCOMM.SendByte(B: Byte): Boolean;
    begin
      Result := Write(B,1) = 1;
    end;function TSNCOMM.Write(var Buff; Bytes: Cardinal): Cardinal;
    var
      ol: TOVERLAPPED;
    begin
      Result := 0;
      if not Connected then Exit;  FillChar(ol,SizeOf(ol),0);
      if not WriteFile(FComHandle,Buff,Bytes,Result,@ol) then
        GetOverlappedResult(FComHandle,ol,Result,True);
    end;function TSNCOMM.WriteByte(B: Byte): Boolean;
    begin
      Result := Write(B,1) = 1;
    end;end.
      

  6.   

    这不是串口通信,一顿API函数么,估计上面代码不能执行,写的太简单了,好象缺点什么东西
    我看小查说的不错