unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, SPComm, StdCtrls;type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Comm1: TComm;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);    procedure Button1Click(Sender: TObject);
    procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
   viewstring:string;
   i:integer;
   rbuf,sbuf:array[1..6] of byte;
implementation{$R *.dfm}
procedure senddata;
var
i:integer;
commflag:boolean;
begin
commflag:=true;
 viewstring:='';
 for i:=1 to 6 do
 begin
 if not form1.comm1.WriteCommData(@sbuf[i],1) then
 begin
 commflag:=false;
 break;
 end;
 sleep(2);
 viewstring:=viewstring+inttohex(sbuf[i],2) +' '; end;
 viewstring:='发送'+viewstring;
 form1.Memo1.Lines.Add(viewstring);
 form1.Memo1.Lines.Add('');
 if not commflag then showmessage('发送失败' );
end;procedure TForm1.FormCreate(Sender: TObject);
begin
comm1.StartComm;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
comm1.StopComm;
end;procedure TForm1.Button1Click(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);
 senddata;
end;procedure TForm1.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;end.
系统说这一句话错误,move(buffer^,pchar(@rbuf^),bufferlength);
原因:[Error] Unit1.pas(86): Pointer type required请帮我改一下

解决方案 »

  1.   

    Move(buffer, rbuf, bufferlength);
    或者
    Move(buffer, rbuf[1], bufferlength);
    或者更增加通用性:
    Move(buffer, rbuf[Low(rbuf)], bufferlength);
      

  2.   

    move(buffer^,(pchar(@rbuf^))^,bufferlength);
      

  3.   

    move(buffer^,pchar(@rbuf)^,bufferlength);这样是对的不过我不是太了解pchar(@rbuf)^啥意思,有人能详细的说一下吗?
      

  4.   

    move(buffer^,pchar(@rbuf)^,bufferlength);这样是对的不过我不是太了解pchar(@rbuf)^啥意思,有人能详细的说一下吗?
    move(buffer^,//--取缓冲区指针解除引用的值;
    pchar(@rbuf)^,//--@rbuf:这是取你的接收缓冲区的入口地址。相当于:@rbuf[0];
                  //pchar(@rubf)这是将你的接收缓冲区指针转换成PCHAR类型指针;也就是^char
                  //(pchar(@rbuf))^这样来看就列清楚了,解除指针引用后取值,实际上就是取指针地址内的值了。 bufferlength);
    呵~~,看看是不是理解清楚了。
      

  5.   

    pchar(@rubf)这是将你的接收缓冲区指针转换成PCHAR类型指针;也就是^char谁能告诉我为啥要转为pchar,这有啥用啊
      

  6.   

    PCHAR相当于:^char
    而CHAR类型是最基本的数据类型,正好是一个字节宽度的数据类型。
      

  7.   

    是不是因为我的rbuf是byte型的,所以要赋给pchar型指针?我想问,赋int型指针行不行啊?
      

  8.   

    move是在两个地址间拷贝数据,Move(D,S,Len)就是从S地址处开始拷贝Len个字节,然后在D地址开始的Len字节空间里存储。D,S并非一定要求是指针,比如
    Move(buffer, rbuf, bufferlength);
    或者
    Move(buffer, rbuf[1], bufferlength);
    或者更增加通用性:
    Move(buffer, rbuf[Low(rbuf)], bufferlength);
    都可以
      

  9.   

    rcvBuf:array [1..300] of Byte;
    Move(buffer^,rcvBuf,20);
    //////////////////////
     CommStr:string;
     Move(Buffer^,CommStr,BufferLength);
    /////////////////////////////////////
    var rbuf :array[0..100]  of byte;
    Move(buffer^,pchar(@rbuf)^,bufferlength);
    …………………………