串口接收数据时,运行几次后,提示variant or safe array index of out bounds错误!!求助各位朋友!谢谢!!

chenquan 2006-03-14 11:53:25
以下代码是一种接收数据处理方式,我都试用了好几种处理方法,都会出现这种问题,郁闷啊!
我跟踪调试了好几次,好象是在赋值的时候出错的!
Var redate: Array of variant;
i:integer;
s1:String;
Begin
redate:=FCom.Input;
if redate=nil then Exit;
s1:='';
for i:=0 to VarArrayHighBound(redate,1) do
s1:=s1+inttohex(redate[i],2);
......
...全文
821 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenquan 2006-03-16
  • 打赏
  • 举报
回复
谢谢大家,问题已经解决
串口接收数据的时候
可能存在缓冲区为空
这时候赋值就会出错!
ztenv 2006-03-15
  • 打赏
  • 举报
回复
你可以试一下spcomm控件,很好用的...不用这么麻烦..
clasj 2006-03-15
  • 打赏
  • 举报
回复
Var
redate: Array of variant;
改为:
Var
redate: variant;
学以致远~ 2006-03-15
  • 打赏
  • 举报
回复
=>FCom.InputMode := comInputModeBinary;

可能是传输方式的问题,改为字符方式试试
aiirii 2006-03-14
  • 打赏
  • 举报
回复
>>variant or safe array index of out bounds
越界了??

从你第一个代码,感觉似乎不是越界,而是 inttohex 可能会出错
Q287413288 2006-03-14
  • 打赏
  • 举报
回复
能说明一下FCom的定义吗,再有就是你的循环测试的完整代码,问题是可以解决的
chenquan 2006-03-14
  • 打赏
  • 举报
回复
我知道错误提示的意思啊
但就是不知道那里错误的
我是用VarArrayHighBound(redate,1) 做为最大长度,应该是自动得到最大列的
下面是我的另外1种写法,循环采集用7,8次后出现同样错误:
var aa: array of byte;
ii, jj: Word;
vTmp1: variant;
ovTmp1: olevariant;
s1: String;
begin
Sleep(200);
jj := FCom.InBufferCount;
SetLength(aa,jj+1);

ovTmp1 := FCom.Input;
vtmp1 := VarArrayCreate([0,jj],varByte);
vtmp1 := ovTmp1;

for ii := 0 to jj - 1 do
aa[ii] := vtmp1[ii];
S1 := '';
for ii := 0 to jj - 1 do
S1 := S1 + IntToHex(aa[ii],2) ; //+ ' ';

//Gget_Data 保存数据信息
GRecStr:=GRecStr+S1; //保存接收字符
GRecStr:=DelSpaceStr(GRecStr);//截取字符串中的空格
cuteant 2006-03-14
  • 打赏
  • 举报
回复
是不是VarArrayHighBound(redate,1)需要减1?
lovendII 2006-03-14
  • 打赏
  • 举报
回复
这种错误一般是赋值给了没有的项,
比方dbgrid(或者一个数组)只有3列,但是你却给它的第四列赋值,
dbgrid.fields[3]:='xxx';
这样就容易出现这种错误。

用数组来举例:
假设一个数组只定义了3个元素,你却给第四个元素赋值,也会出现这类错误
chenquan 2006-03-14
  • 打赏
  • 举报
回复
我现在 把程序改成:
Var redate: Array of variant;
cqii:integer;
cqs1:String;
Begin
cqs1:='';
sleep(100);
//redate:=nil;
//if FCom.InBufferCount<10 then Exit;
try
redate:=FCom.Input;
except
showmsg('出错了!',myerror);
end;
运行了7,8次还是报了同样的错误!!
各位朋友帮我看看怎么回事情的
是不是硬件程序通信出错,引起这样的问题
chenquan 2006-03-14
  • 打赏
  • 举报
回复
修改为:
try
redate:=FCom.Input;//??
except
showmsg('出错了!',myerror);
end;
系统会弹出设定的错误信息,各位朋友是否上面??处赋值有问题
clasj 2006-03-14
  • 打赏
  • 举报
回复
帮顶
chenquan 2006-03-14
  • 打赏
  • 举报
回复
这个程序还有个问题:
可能也是提示越界的原因
我单步运行程序 可能7,8次才会提示错误
如果直接运行程序,可能数据采集2,3次的时候就出现这个问题
会不会是数据地址问题
chenquan 2006-03-14
  • 打赏
  • 举报
回复
其实,在最后我也增加了
if VarArrayHighBound(redate,1)<10 then Exit;
aiirii 2006-03-14
  • 打赏
  • 举报
回复
>> if redate=nil then Exit;
这句,似乎应该也检查,
最好在调试的时候,
在这句后,检查
VarArrayHighBound(redate,1)
的值
chenquan 2006-03-14
  • 打赏
  • 举报
回复
//创建设置TMSCOMM
FCom := TMSComm.Create(nil);
FCom.CommPort := iCom; //com1,com2,com3
FCom.RThreshold := 0; //接收缓冲区收到每一个字符不产生 OnComm 事件
FCom.InputMode := comInputModeBinary;
FCom.InBufferSize :=2048;
FCom.Settings := '2400,m,8,1';
我屏蔽 inttohex 下边语句再测试下,谢谢你们!

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧