var
  Form1: TForm1;
  rbuf,sbuf:array[1..8] of byte;
implementation{$R *.dfm}procedure TForm1.Button2Click(Sender: TObject);//给变量赋值
begin
  sbuf[1]:=byte($f0); //帧头
  sbuf[2]:=byte($01); //命令号
  sbuf[3]:=byte($ff);
  sbuf[4]:=byte($ff);
  sbuf[5]:=byte($01);
  sbuf[6]:=byte($f0); //帧尾
end;procedure TForm1.Button1Click(Sender: TObject);//发送代码
var
  HSendStr,DSendStr,sendstr : string;
  i : integer;
begin
  for i := 1 to 6 do
  begin
    comm1.WriteCommData(@sbuf[i],1);
    sleep(200);
    sendstr := '';
    sendstr:=sendstr + inttohex(sbuf[i],2)+'';
    sendstr:='发送'+sendstr;
    memo1.lines.add(sendstr);
    memo1.lines.add('');
  end;
end;procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;//接收代码
  BufferLength: Word);
var
  viewstring,rstr : string;
  i : integer;
begin  {SetLength(Rstr, BufferLength);
  move(buffer^,pchar(Rstr)^,bufferlength);
  for i:=0 to bufferlength do
  memo1.Lines.Add(Rstr);
  Memo1.Invalidate;}
  viewstring := '';
  move(buffer^,rbuf,bufferlength);
  for i := 1 to bufferlength do
  begin
    //viewstring:=viewstring+ inttohex(rbuf[i],2)+'';
    viewstring := viewstring + inttohex(rbuf[i],2)+'';
    memo1.lines.add('接收' + viewstring);
    memo1.lines.add('');
  end;end;接收的显示:接收F8接收F1接收FF接收FF接收F9接收F81、为什么接收到的不是发送的?
2、发送16进制数,接收的buffer里是10进制的?不然为什么显示时要用inttohex(rbuf[i],2)?

解决方案 »

  1.   

    没用过这个组件哦:)http://lysoft.7u7.net
      

  2.   

    //接收过程  读数据
    procedure TFComm.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
    var
      i:integer;
    begin
      viewstring:='';
      move(buffer^,pchar(@rbuf)^,bufferlength);
      for i:=1 to bufferlength do
        viewstring:=viewstring+inttohex(rbuf[i],2)+' ';
      if viewstring = 'E5 ' then
      j:=1;
      viewstring:='接受'+viewstring;
      memo1.lines.add(viewstring);
      memo1.lines.add('');
    end;
      

  3.   

    if viewstring = 'E5 ' then什么意思?
      

  4.   

    这才是正确的
    //接收过程  读数据
    procedure TFComm.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
    begin
      viewstring:='';
      move(buffer^,pchar(@rbuf)^,bufferlength);
      for i:=1 to bufferlength do
        viewstring:=viewstring+inttohex(rbuf[i],2)+' ';
      viewstring:='接受'+viewstring;
      memo1.lines.add(viewstring);
      memo1.lines.add('');
    end;
      

  5.   

    我的程序可以接收了,而且正确。但我现在有新问题:
        comm1.WriteCommData(@sbuf[i],1);
        sleep(200);
    如果sleep(1)或者没有这句。那程序只能接收到F0(应该是第一个);如果sleep(5)或者sleep(10),接收后显示为:
    接收F0接收F001接收F001FF接收F001FFFF接收F001FFFF01接收F001FFFF01F0
    如果sleep(200)或者更长,则显示为:
    接收F0接收01接收FF接收FF接收01接收F0为什么????
      

  6.   

    另:新做了一个程序,想接收字符串可仍然接收到第一个字符而已:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Sstr : string;
    begin
      sstr := edit1.Text;
      comm1.WriteCommData(pchar(sstr),length(sstr));
    end;procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    var
      Rstr : string;
    begin
     setlength(rstr,bufferlength);
      move(buffer^,pchar(rstr)^,bufferlength);
      memo1.Lines.Add(rstr);
    end;发送‘Edit1’,只能接收到‘E’,为什么?
      

  7.   

    sleep(200);这个是延时,要根据你使用的协议来设置的
      

  8.   

    comm1.WriteCommData(pchar(sstr),length(sstr));因为这一句只发送了一个啊
      

  9.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      Sstr : string;
      i:integer;
    begin
      sstr := edit1.Text;
      intlen:=len(edit1.text);
      for i:=1 to intlen
        comm1.WriteCommData(pchar(sstr),length(sstr));  
    end;
      

  10.   

    comm1.WriteCommData(pchar(sstr),length(sstr));
    这句不是把整个字符串都发出去了吗?
      

  11.   

    不是,
    pchar(sstr)  是需要发送的字符串
    length(sstr)  是发送字符串的长度
      

  12.   

    procedure senddata;
    var
      i:integer;
    begin
      viewstring:='';
      for i:=1 to 33 do
      begin
        if not fcomm.comm1.writecommdata(@sbuf[i],1) then
        begin
          break;
        end;
        //if i=7 then sleep(200); {发送时字节间的延时}
        viewstring:=viewstring+inttohex(sbuf[i],2)+' ';
      end;
      viewstring:='发送'+viewstring;
      fcomm.memo1.lines.add(viewstring);
      fcomm.memo1.lines.add('');
    end;
    就这个啦,别再改啦
      

  13.   

    comm1.WriteCommData(pchar(sstr[i]),SizeOf(sstr[i]));
        sleep(10);
    应该这样吧,编译没错,可运行到这里出错。为什么?
      

  14.   

    var
     Viewstring:string;
      i:integer;
      rbuf,sbuf:array[1..33] of byte;//自定义的发送过程
    procedure senddata;
    var
      i:integer;
    begin
      viewstring:='';
      for i:=1 to 33 do
      begin
        if not fcomm.comm1.writecommdata(@sbuf[i],1) then
        begin
          break;
        end;
        //if i=7 then sleep(200); {发送时字节间的延时}
        viewstring:=viewstring+inttohex(sbuf[i],2)+' ';
      end;
      viewstring:='发送'+viewstring;
      fcomm.memo1.lines.add(viewstring);
      fcomm.memo1.lines.add('');
    end;//发送  写数据
    procedure TFComm.Btn_sendClick(Sender: TObject);
    var
      i,n:integer;
    begin
        sbuf[1]:=$68;
        sbuf[2]:=$1B;
        sbuf[3]:=$1B;
        sbuf[4]:=$68;
        sbuf[5]:=$02;
        sbuf[6]:=$00;
        sbuf[7]:=$6c;
        sbuf[8]:=$32;
        sbuf[9]:=$01;
        sbuf[10]:=$00;
        sbuf[11]:=$00;
        sbuf[12]:=$00;
        sbuf[13]:=$00;
        sbuf[14]:=$00;
        sbuf[15]:=$0e;
        sbuf[16]:=$00;
        sbuf[17]:=$00;
        sbuf[18]:=$04;
        sbuf[19]:=$01;
        sbuf[20]:=$12;
        sbuf[21]:=$0a;
        sbuf[22]:=$10;
        sbuf[23]:=$02;
        sbuf[24]:=$00;
        sbuf[25]:=$01;
        sbuf[26]:=$00;
        sbuf[27]:=$01;
        sbuf[28]:=$84;
        sbuf[29]:=$00;
        sbuf[30]:=$02;
        sbuf[31]:=$d0;
        sbuf[32]:=$3a;
        sbuf[33]:=$16;
        senddata;{调用发送函数}
    end;//接收过程  读数据
    procedure TFComm.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
    var
      i:integer;
    begin
      viewstring:='';
      move(buffer^,pchar(@rbuf)^,bufferlength);
      for i:=1 to bufferlength do
        viewstring:=viewstring+inttohex(rbuf[i],2)+' ';
      viewstring:='接受'+viewstring;
      memo1.lines.add(viewstring);
      memo1.lines.add('');end;