MSComm控件问题(Error reading comm device)
一下是程序的关键部分代码:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//初始化时设置
MSComm1->InputLen = 0; //设置或返回一次从接收缓冲区中读取字节数,0表示一次读取所有数据
MSComm1->InBufferSize=10000; //设置接收缓冲区10000Byte
MSComm1->InBufferCount=0;
MSComm1->OutBufferSize =500; //设置发送缓冲区500Byte
MSComm1->OutBufferCount = 0;
MSComm1->InputMode = 1; //以2进制读取
MSComm1->RThreshold =1; //每个字符到接收缓冲区都触发接收事件
MSComm1->SThreshold = 0; //发送不产生中断
MSComm1->Settings="9600,n,8,1" ; //设置串口信息
MSComm1->CommPort=11; //设置通讯串口
MSComm1->PortOpen=True; //打开串口
//以上为串口的初始化
}
//--------------------------------------
void __fastcall TForm1::MSComm1Comm(TObject *Sender)
{
OleVariant temp; //声明变体变量
int flag; //缓冲区的字节数
if(MSComm1->CommEvent==2) //检测COmmEvent的值是否为2,即是否有接收事件发生
{ flag= MSComm1->InBufferCount; //读取缓冲区的字节数,并且在Memo1显示
Memo1->Text=flag;
if(flag>0)
{ temp= MSComm1->Input; //********************************************************
Memo2->Text=temp; //读取缓冲区的内容,并且在Memo2显示
}
else return;
}
else return;
}
程序编译可以通过
我的目的是从COM11口读入GPS模块(蓝牙)发来的数据
程序运行后,弹出这样的错误:Error reading comm device,并且一直弹,但是Memo1可以显示缓冲区的字节数
如果我把temp= MSComm1->Input 去掉后就不会弹错了
按照上面的情况,可以推断缓冲区是有数据的,但是只要运行MSComm1->Input 就弹错
望高人能指点一下,一定给高分
[解决办法]
建议使用PCOMM.DLL写串口程序,
[解决办法]
既然用CB,建议还是用SPCOMM控件,我已经用了10来年了,很好用的。
[解决办法]
二进制方式,最好不要那样读。
最好用如下方法
if (MSComm->PortOpen)
return;
MSComm->CommPort= 2;
MSComm->Settings= "115200, n, 8, 1";
MSComm->InBufferSize= 4096;
MSComm->OutBufferSize= 2048;
MSComm->RThreshold= 1;
MSComm->SThreshold= 1;
MSComm->InputMode= comInputModeBinary;
try {
MSComm->PortOpen= true;
MSComm->InputLen= 0;
MSComm->InBufferCount= 0;
MSComm->OutBufferCount= 0;
ShowStatueMessage(1);
Log(1, "连接成功");
}
catch (...){
ShowStatueMessage(0);
}
..........
//---------------------------------------
void __fastcall TFrmMain::MSCommComm(TObject *Sender)
{
char szBuf[RxBUFFERSIZE]={0};
int i, j;
OleVariant RxBuff;
switch (MSComm->CommEvent)
{
/* case comEvSend:
ShowMessage("Send!!!!");
case comEvCTS:
ShowMessage("CTS!!!!");
case comEvDSR:
ShowMessage("DSR!!!!");
case comEvCD:
ShowMessage("CD!!!!");
*/
///*
case comEvReceive:
if (MSComm->InBufferCount > 0) {
RxBuff= MSComm->Input;
j= RxBuff.ArrayHighBound(1);
for (i=0; i<=j; i++)
szBuf[i]= RxBuff.GetElement(i);
szBuf[i]= NULL;
#ifdef _DEBUG
RichEdit1->Lines->Add(AnsiString(szBuf));
#endif
if (strstr(szBuf, "+CMTI") != 0) // 收到短消息了
{
// ShowMessage("来短消息了");
ProcessSMS(szBuf);
}
}
break;
//*/
case comEvRing:
ShowMessage("来电话了!!!!");
break;
}
}