用了Input.GetElement后,并没有把缓冲区数据完全清除,怎么回事

longjunhua 2004-10-09 11:31:21
我通过以下代码读取数据,InputLen=1;MSComm.RThreshold = 1

while (i_pMsComm->InBufferCount>0)
{
i_data[num++]=(byte)i_pMsComm->Input.GetElement(0);
}

40KB大小的数据,当num=35000左右时,跳出了循环,说明缓冲区没数据了啊。等再一次触发Oncomm事件,并进入时,却马上出现错误。说variant array index out of bound.

我都读了35KB左右的数据了,缓冲区有30000,为什么还会出现这个问题呢?
难道是读取过程中,并没有把已经读取数据清除,不可能啊,INPUT会自动清除啊,不然也不会跳出循环啊

请高手指点一下
...全文
80 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
longjunhua 2004-10-09
  • 打赏
  • 举报
回复
应该完全接受到了,因为当文件大小小点的时候,传输正常
longjunhua 2004-10-09
  • 打赏
  • 举报
回复
我原以为是num越界,可是改为LONG 型后
缓冲区改为8012 传17KB大小文件,在num=10000左右时又出错
wiseyao 2004-10-09
  • 打赏
  • 举报
回复
虽然你的MSComm.RThreshold = 1是设置为1,但估计并不是每接收到一个这符都会触发oncomm事件,这样你并没有完全接收到数据,我以前碰到过这种问题,后来我都不敢用oncomm来接收数据了,还是直接input好过.
longjunhua 2004-10-09
  • 打赏
  • 举报
回复
i_data大小肯定没有问题
longjunhua 2004-10-09
  • 打赏
  • 举报
回复
我的结构如下
……
{
...// Line 5
OnComm(..);// Line 4
。。。。Line 7
.. //Line 3
}

onComm(..)
{
...
case .. :
return : OnDownLoad(..); // line 2
...
}

OnDownLoad(...)
{
.....
while (i_pMsComm->InBufferCount>0)
{
byte buf=(byte)i_pMsComm->Input.GetElement(0);// Line 1
i_data[num++]=buf;
}
...
return CONTINUE; //Line 6
}


本来正常情况下,如果手机传送过来的数据速度够快,i_data会取完所有数据后才跳出循环。
如果不快,当取完缓冲区的数据后,也会跳出循环,到达Line 6,Line 7,Line 3,
等下个数据到达后,Line 5,Line 4,Line 2,Line 1这样进入循环体再次开始取值
可现在情况是,手机速度足够快。当i_data取得的数据比缓冲区长度大以后,(可能大100左右字节左右,也可能大200字节左右,不一定。)就会跳出循环。到达Line 6,Line 7,Line 3,然后直接跳到Line 1 !!!!!然后循环几次后在Line 1处报错!variant array index out of bound.
它怎么能直接就进入while内部了呢!!!

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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