急!MSCOMM控件出错问题 300分送上!!!(100分)

  • 主题发起人 主题发起人 qinzixue
  • 开始时间 开始时间
Q

qinzixue

Unregistered / Unconfirmed
GUEST, unregistred user!
使用串口控件 MSCOMM
读取数据时出现 'VARIANT OR SAFE ARRAY INDEX OUT OF BOUNDS' 向各位高手请教
 
你把你的问题说清楚下,或着贴出你的代码
 
串口控件的属性 INPUTMODE=1 为二进制方式

先定义:qq:array of byte;


procedure TForm1.MSComm1Comm(Sender: TObject);
begin
qq:=form1.MSComm1.input;
if qq[0]>=128 then
begin
a3:=0;
end
else
begin
a3:=qq[0]*256+qq[1];
end;
//下面是对A3的使用。
.........
END;
 
procedure TForm1.MSComm1Comm(Sender: TObject);
begin
qq:=form1.MSComm1.input;
if qq[0]>=128 then <<-----如果没接收到数据,qq[0]调用可能会出错,先判断下长度
begin
a3:=0;
end
else
begin
a3:=qq[0]*256+qq[1]; <<-----
end;
 
nicai_wgl 可不可以说详细点,我之前用过这种方法,也出错,或者我写的不对??
 
qq[0]不对,是qq[1],因为字符串这样取数是从1到length(qq)
 
再说明一下,取的数据是实时控制的,而且不是总出错!感觉好象数据正负改变时出错!!!
 
先检查波特率和硬件的是一样吗
 
procedure TForm1.MSComm1Comm(Sender: TObject);
begin
if form1.MSComm1.inputleng=0 then exit;//我忘记是什么了,应该有一个输入缓冲区的长度。你加上试试。
qq:=form1.MSComm1.input;
if qq[0]>=128 then
begin
a3:=0;
end
else
begin
a3:=qq[0]*256+qq[1];
end;
//下面是对A3的使用。
.........
END;
 
先定义:qq:array of byte; 动态分配的时候有问题太小或者根本没有 分配
 
问题就是上面这么解释的!就看你怎么去解决了!
 
DELPHFANS: 先定义:qq:array of byte; 动态分配的时候有问题太小或者根本没有 分配
什麽意思? 那我应该怎麽定义?
 
setlength (qq,300) 就是把动态数组指定下
 
定义不定义动态数组没关系,因为你使用的时候,如果系统发现没有分配内存空间,系统将自动完成.
首先触发此事件,肯定是有数据过来了.否则不会产生.
给你个例子你可参考一下.
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
Com.CommPort:=1;
Com.Settings:='4800,N,8,1';
Com.RThreshold:=1;
Com.InputMode:=comInputModeBinary;
Com.InputLen := 0;
Com.SThreshold := 0; //一次发送所有数据
Com.InBufferCount := 0; //清空读取缓冲区
Com.OutBufferCount := 0; //清空发送缓冲区
Com.PortOpen:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
senddata:array[1..5] of char;
sendstr:string;
i:longint;
begin
senddata[1]:=chr($0E); //要发送的数据
senddata[2]:=chr($03);
senddata[3]:=chr($FF);
senddata[4]:=chr($03);
senddata[5]:=chr($00);
sendstr:='';
for i:=1 to 5 do
sendstr:=sendstr + senddata;
com.output:=sendstr; //发送数据
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
senddata:array[1..5] of char;
sendstr:string;
i:longint;
begin
senddata[1]:=chr($0E); //要发送的数据
senddata[2]:=chr($03);
senddata[3]:=chr($FF);
senddata[4]:=chr($03);
senddata[5]:=chr($00);
sendstr:='';
for i:=1 to 5 do
sendstr:=sendstr + senddata;
com.output:=sendstr; //发送数据
end;
procedure TForm1.ComComm(Sender: TObject);
var
reData:array of Variant;
Restr:string;
i:longint;
begin
case com.CommEvent of
comEvReceive:
begin
redata:=com.Input;
Restr:='';
for i:=0 to vararrayhighbound(redata,1) do
Restr:=Restr + inttohex(redata,2)+' ';
end;
end;
end;
end.
 
http://jfyes.blog.163.com/article/-hhFh004cVsM.html
 
串口控件的属性 INPUTMODE=1 为二进制方式

先定义:qq:array of byte;


procedure TForm1.MSComm1Comm(Sender: TObject);
begin
setlength(qq,200); //加这句保证没问题
qq:=form1.MSComm1.input;
if qq[0]>=128 then
begin
a3:=0;
end
else
begin
a3:=qq[0]*256+qq[1];
end;
//下面是对A3的使用。
.........
END;
 
数据类型错误
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部