我都快疯了,怎么会这样!

longjunhua 2004-10-12 01:10:06
用的控件是MSComm32.OCX 6.0 version 1.1
代码如下

long int num=0;
byte i_data[20000];

void __fastcall TForm1::Button1Click(TObject *Sender)
{
MSComm1->InBufferCount=0;//初始化端口配置
MSComm1->OutBufferCount=0;
MSComm1->RThreshold=0;
MSComm1->SThreshold=0;
MSComm1->InputMode=1;
MSComm1->Settings="115200,n,8,1";
MSComm1->InBufferSize=8192;
MSComm1->OutBufferSize=8192;
MSComm1->DTREnable=true;
MSComm1->RTSEnable=true;
MSComm1->CommPort=3;
MSComm1->PortOpen=true;
MSComm1->InputLen=1;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::MSComm1Comm(TObject *Sender)//响应函数
{
while (MSComm1->InBufferCount>0)
{
//untempt=i_pMsComm->InBufferCount;
i_data[num++]=(byte)MSComm1->Input.GetElement(0);// <----- L1
//untempt=i_pMsComm->InBufferCount;

}
//if(num>10000)
//{//
// ShowMessage("ok");
// }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)//发送指令
{

MSComm1->InBufferCount=0;
MSComm1->OutBufferCount=0;


AnsiString s="AT………………/video.jpg\"\r\n";//命令是将该文件上传
MSComm1->RThreshold=1;
MSComm1->Output=s;
//MSComm1->Output="AT$…………/12.jpg\"\r\n";
}
在Window2000 perfessional版本中,不能传比缓冲区大的文件。在L1处报错"variant array index out of bound。有时候只是报错,但不指定位置,说STACK OVERFLOW.
在一台XP上,可以比缓冲区大的文件,完全正常
在另一台XP上,也不能传。报同样的错。

都是BCB6.0,控件一样,搞了几天了都不知道原因
请大家帮我想想是什么原因。最好不是硬件原因,因为这个程序必须在所有机子上通用。
...全文
284 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzlbj 2004-11-11
  • 打赏
  • 举报
回复
请使用正版软件
free1688 2004-11-08
  • 打赏
  • 举报
回复
还需研究一下。
seaskysamecolor 2004-11-02
  • 打赏
  • 举报
回复
控件中有个,接收数据触发,变成每一个触发就可以了,后来加上适当的延时
longjunhua 2004-10-13
  • 打赏
  • 举报
回复
就这么简单一段代码,没有其他的干扰,只是上传个文件,为什么都不行?
难道MSComm真的是垃圾?!
clong320 2004-10-13
  • 打赏
  • 举报
回复
MSComm控件接收时,不能用 OleVariant 数组:
void __fastcall TForm1::MSComm1Comm(TObject *Sender)
{
AnsiString s;
OleVariant RxBuff;
char buffer[256];

MSComm1->RThreshold = 0;

switch(MSComm1->CommEvent)
{
case comEvReceive:
RxBuff = MSComm1->Input;
s = RxBuff.operator WideString();


if(!s.IsEmpty()) Memo1->Lines->Add(s);
break;
}
MSComm1->RThreshold = 1;

}

这种方法只能接收到不为0x00的数据,至于如何接收到数据0x00,还等高手指点。
laiyulin 2004-10-12
  • 打赏
  • 举报
回复
努力学习
wycg_cnh20 2004-10-12
  • 打赏
  • 举报
回复
学习
longjunhua 2004-10-12
  • 打赏
  • 举报
回复
和中断无关,我试了。这也无法解释为什么机子不一样,结果不一样
free1688 2004-10-12
  • 打赏
  • 举报
回复
看看
clong320 2004-10-12
  • 打赏
  • 举报
回复
这跟缓冲区大小无关,主要是中断嵌套问题,修改方法:
void __fastcall TForm1::MSComm1Comm(TObject *Sender)//响应函数
{
MSComm1->RThreshold=0; //关中断
while (MSComm1->InBufferCount>0)
{
//untempt=i_pMsComm->InBufferCount;
i_data[num++]=(byte)MSComm1->Input.GetElement(0);// <----- L1
//untempt=i_pMsComm->InBufferCount;

}
//if(num>10000)
//{//
// ShowMessage("ok");
// }
MSComm1->RThreshold=1; //开中断
}
thp 2004-10-12
  • 打赏
  • 举报
回复
wuxq7311 2004-10-12
  • 打赏
  • 举报
回复
说不清楚,以前我在使用SPCOMM的时候也出现问题,就是传送大文件的时候就出错!

703

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
  • ActiveX/COM/DCOM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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