待码如下:
procedure TfrmMainComm.CommTest1ReceiveData(Sender: TObject;
  Buffer: PAnsiChar; BufferLength: Word);
var
  j: integer;
  s: string;
begin
  j := BufferLength;  SetLength(S, j);
  Move(Buffer^, PChar(s)^, j);
  Memo1.Lines.Text:=Memo1.Lines.Text + s;
end;偶实在找不到原因了。

解决方案 »

  1.   

    你这段代码我已经试过,是没有问题的
    请检查你的串口设置是否正确,还有需要 CommTest1.StartComm;
      

  2.   

    procedure TfrmMainComm.Button1Click(Sender: TObject);
    begin
      if (Button1.Caption = '打开串口') and
         (not CommTest1.PortOpen) then
      begin
        with CommTest1 do
        begin
          CommPort:= cbPort.ItemIndex+1;
          BaudRate:= StrToInt(cbBaut.Text);
          StartComm;
          if PortOpen then
            Button1.Caption := '关闭串口'
          else
            showmessage('com is not exist,or is closed');
        end;
      end
      else
      begin
        CommTest1.StopComm ;
        Button1.Caption := '打开串口'
      end;
    end;procedure TfrmMainComm.Button2Click(Sender: TObject);
    begin
      if (Button2.Caption = '打开串口') and
         (not CommTest2.PortOpen) then
      begin
        with CommTest2 do
        begin
          CommPort:= ComboBox1.ItemIndex+1;
          BaudRate:= StrToInt(ComboBox2.Text);
          StartComm;
          if PortOpen then
            Button2.Caption := '关闭串口'
          else
            showmessage('com is not exist,or is closed');
        end;
      end
      else
      begin
        CommTest2.StopComm ;
        Button2.Caption := '打开串口'
      end;
    end;procedure TfrmMainComm.CommTest1ReceiveData(Sender: TObject;
      Buffer: PAnsiChar; BufferLength: Word);
    var
      j: integer;
      s: string;
    begin
      j := BufferLength;  SetLength(S, j);
      Move(Buffer^, PChar(s)^, j);
      Memo1.Lines.Text:= Memo1.Lines.Text + s;
    end;procedure TfrmMainComm.CommTest2ReceiveData(Sender: TObject;
      Buffer: PAnsiChar; BufferLength: Word);
    var
      j: integer;
      s: string;
    begin
      j := BufferLength;  SetLength(s, j);
      Move(Buffer^, PChar(s)^, j);
      Memo3.Lines.Text:= Memo3.Lines.Text + s;
    end;procedure TfrmMainComm.btnSend1Click(Sender: TObject);
    begin
      CommTest1.WriteCommData(Pchar(Memo2.Text),Length(Memo2.Text));
    end;procedure TfrmMainComm.btnSend2Click(Sender: TObject);
    begin
      CommTest2.WriteCommData(Pchar(Memo4.Text),Length(Memo4.Text));
    end;           //SetLengthprocedure TfrmMainComm.Timer1Timer(Sender: TObject);
    begin
      if CheckBox1.Checked
      then CommTest1.WriteCommData(Pchar(Memo2.Text),Length(Memo2.Text))
    end;procedure TfrmMainComm.Edit1Change(Sender: TObject);
    begin
      Timer1.Interval:=strtoint(Edit1.text)
    end;
    end.
    有,startcomm,可以发送,就是不能接收。 
      

  3.   

    procedure Tfrmmain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    var
      s_fetch:string;
    begin
      setlength(s_fetch,bufferlength);
      move(buffer^,pchar(@s_fetch[1])^,bufferlength);
      arr[0]:=strtofloat(copy(s_fetch,2,11));
      arr[1]:=strtofloat(copy(s_fetch,15,11));
      arr[2]:=strtofloat(copy(s_fetch,28,11));
      arr[3]:=strtofloat(copy(s_fetch,41,11));
    end;
    上面是我以前写的一个 记得当时也是memo没有数据 而实际上字符串s_fetch 已经有值了你直接show一下你的s值看看
     
    j := BufferLength; 
      SetLength(s, j); 
      Move(Buffer^, PChar(s)^, j); 
      Memo3.Lines.Text:= Memo3.Lines.Text + s; 
      

  4.   

    我觉得很多用SPCOMM通信不成功,是因为SPCOMM的默认有个通信协议是设置成ON,你要把它设置为OFF,这个不知道你注意了没有InX_XonXoffFlow这个参数要设置为FALSE,默认是TURE的
      

  5.   


    6楼正解,我也是遇到过这样的情况但是我觉得楼主这里的情况有点不一样,InX_XonXoffFlow属性是设置握手协议,也就是说握手协议用到的字符,程序会认为是开始通信和结束通信的标记而不算作是数据的内容,给忽略掉,但是握手协议之外的数据还是可以接收到的。所以请楼主先确认一下,串口是不是有数据发送过来。建议楼主用个示波器接在串口的接收引脚上,看看有没有波形过来,有的话就是你程序的设置问题,如果没有的话,就检查串口发送端(和你通信的那个机器的发送端)。如果楼主没有示波器的话,网上下个AccessPort也可以用。试过后结果发上来,别人好帮你判断
      

  6.   

    我用两其它的串口工具试过了,可以收到,可以排除是硬件问题。
    就是这个程序收不到。
    SPCOMM控件设置如下:
    boudrate:9600
    bytesize:8
    commname:com1
    commport:2
    dsrsensitivity:false
    dtrcontrol:EtrEnable
    IgnoreNullChar:False
    Inx_XonXoffFlow:False
    Output
      Type:Unassigned
    Outx_CtsFlow:False
    Outx_DsrFlow:False
    Outx_XonXoffFlow:False
    Parity:None
    ParityCheck:None
    PortOpen:False
    PortOpenError:
    ReddintervalTime:100
    ReadTotalTimeoutConstart:0
    ReadTotalTimeoutMultiplier:0
    ReplacedChar:#0
    ReplaceWhenParityError:False
    RtsControl:RtsDisable
    TxcontinueOnXoff:False
    WriteTotalTimeoutConstant:0
    ReadTotalTimeoutMultiplier:0
    XoffChar #19
    XoffLimit 500
    XonChar #17
    XonLimit 500
      

  7.   

    用AccessPort监视一下,我这段就是这么走过来的,相信我好了
    不知道哪里下的话,我传给你,邮箱给我
      

  8.   

    [email protected]
    恩人哪,非常感谢!
      

  9.   

    还有这个参数,为什么设置为False,以后重新从DELPHI打开,又自动变为ON,是不是在程序里要重新附值
      

  10.   

    我用SPCOMM修正版的,问题解决了。楼主如果有诚意问我要代码,建议加分到150分。
      

  11.   

    后来换了一个spcomm,可以通讯了。
      

  12.   

    今天调试时,把这个参数改成1,就可以了,兴奋死我了。
    ReddintervalTime:1