有关指针的问题 move(buffer^,pchar(@rbuf^),bufferlength); 很混乱。。。(50分)

  • 主题发起人 主题发起人 Adam_lan
  • 开始时间 开始时间
A

Adam_lan

Unregistered / Unconfirmed
GUEST, unregistred user!
rbuf:array[0..16] of byte;
Buffer: pointer;
BufferLength: Word;
..........
move(buffer^,pchar(@rbuf^),bufferlength);
运行到move句时出错:Pointer type required.
请问各位高手为什么会出错,怎么改?[:(]

 
move(buffer^,rbuf,bufferlength);
 
原程序是这样的:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, SPComm;
type
Tfcomm = class(TForm)
Comm1: TComm;
Memo1: TMemo;
Btn_send: TButton;
Button2: TButton;
procedure Btn_sendClick(Sender: TObject);
procedure Formshow(sender: Tobject);
procedure Formclose(sender: Tobject;
var Action: TCloseAction);
procedure Comm1ReceiveData(Sender: TObject;
Buffer: Pointer;BufferLength: Word);
private
{ Private declarations }
public
{ Public declarations }
end;

//变量说明
var
comm1:tcomm;
fcomm:Tfcomm;
viewstring:string;

i:integer;
rbuf,sbuf:array[0..16] of byte;
implementation
{$R *.dfm}
//打开串口
procedure TFCOMM.FormShow(Sender: TObject);

begin

comm1.StartComm;
end;


//关闭串口
procedure TFCOMM.FormClose(Sender: TObject;
var Action: TCloseAction);
begin

comm1.StopComm;

end;


//自定义发送数据过程
procedure senddata;

var
i:integer;

commflg:boolean;

begin

viewstring:='' ;
commflg:=true;

for i:=1 to 6 do

begin

if not fcomm.comm1.writecommdata(@sbuf,1) then

begin

commflg:=false;

break;

end;


//发送时字节间的延时
sleep(2);

viewstring:=viewstring+ inttohex(sbuf,2)+'';
end;

viewstring:='发送'+viewstring;
fcomm.memo1.lines.add(viewstring);

fcomm.memo1.lines.add('');
if not commflg then
messagedlg('发送失败 !' ,mterror,[mbyes],0);
end;


//发送按钮的点击事件
procedure TFCOMM.Btn_sendClick(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 TFCOMM.Comm1ReceiveData(Sender: TObject;
Buffer: pointer;BufferLength: Word);
var
i:integer;
begin

viewstring:='' ;
//move(buffer^,pchar(@rbuf^),bufferlength);
move(buffer^,rbuf,bufferlength);
for i:=1 to bufferlength do

viewstring:=viewstring+ inttohex(rbuf,2)+'';
viewstring:='接收'+ viewstring;
memo1.lines.add(viewstring);

memo1.lines.add('' );
end;
end.
将出错的那句改成你的那句后语法没有错误,可以运行了,但。。。。
你对这个程序有什么意见或看法吗?(程序用到了TComm控件 (pcomm))
 
move(buffer^,pchar(@rbuf^),bufferlength);
改成:
move(buffer^,pchar(@rbuf)^,bufferlength);
就ok了,恭喜!
 
creation-zy的方法较简单
 
发送失败![:(]
 
move(buffer^,pchar(@rbuf^),bufferlength);
改成:
move(buffer^,pchar(@rbuf)^,bufferlength);
一定是可以成功的。我以前也遇到过的。
一样的程序。
 
发送失败 大概是发送的问题
sleep(2)是延时 2 毫秒,就是 0.002秒
你确实只等待这么点时间?
 
呵呵。UPUP
Move挺好用的。
 
改成sleep(2000)两秒还是不行,你们有没有把程序拷过去试呀,光这样看一看然后说哪行?
原文地址:http://vip.6to23.com/aizb/subpage/delphidoc/spcomm.htm
 
当第一次调用senddata,运时到if not fcomm.comm1.writecommdata(@sbuf,1) then

这一句时,writecommdata()返回的是false,所以。。发送失败(还没运行到
move(buffer^,pchar(@rbuf)^,bufferlength);呢[:D])。但是为什么wirtecommdata()返回的
是false呢?没可能呀,到底是怎么了?
 
算了,你们地呢班佬靠唔住,我仲系食自已好过。
 
多人接受答案了。
 
后退
顶部