再谈MSComm控件接收大量数据的问题!
时间:2011-12-16
来源:互联网
大家好,这个问题应该比较常见,但我还是不完全理解,为此又发帖寻求大家的帮助!
我要接收的数据量最大是32KB,当接收一二百个字节时没有任何问题,但是有时接收甚至超过二百就出现问题了。奇怪的是有时候接收上万个字节也能接收到。我的代码如下:设置参数为19200,N,8,1
m_com.SetInBufferSize(0x7FFE); //输入缓冲区
m_com.SetOutBufferSize(1024); //输出缓冲区
m_com.SetPortOpen(TRUE); //打开串口
m_com.SetInputMode(1); //以二进制方式检取数据
m_com.SetRThreshold(1);//多于或等于1个字符时,将引发OnComm事件
m_com.SetInputLen(0);//设置当前接收区数据长度为0,表读取全部数据
m_com.GetInput(); //预读以清除数据
OnComm函数主要内容如下:
switch(m_com.GetCommEvent())
case 2:
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
CString strtemp,stringe;
variant_inp=m_com.GetInput();//读取缓冲区
safearray_inp=variant_inp; //VARIANT型变量转为ColeSageArray型变量
len=safearray_inp.GetOneDimSize();//得到有效数据长度
for(k=0;k <len;k++)
{
safearray_inp.GetElement(&k,rxdata+m_readLen+k);//转为BYTE型数组
}
m_readLen=m_readLen+len;
//接收的数据已经存到rxdata数组中
//检查数据格式对否
if(CheckData(rxdata,m_readLen))//这里经常难以通过。。。
{
for(k=0;k <m_readLen;k++)
{
g_recevData[k]=rxdata[k]; //转存到全局数组
}
m_com.SetInBufferCount(0); //(添加)清空接收缓冲区内容等待下次接收
m_readLen=0; //转存完毕后,将m_readLen设为0;
sArrive=TRUE; //设置可以读标志
}
else
{
AfxMessageBox( "数据检查不通过 ");
}
break;
}
default:
break;
}
这里还有个问题,有时候如果第一次接收没有成功,则下次再接收另外一组数据也难以成功,从而导致验证数据格式也失败!对应MSComm控件接收大数据问题,大家有什么好的方法啊?
我要接收的数据量最大是32KB,当接收一二百个字节时没有任何问题,但是有时接收甚至超过二百就出现问题了。奇怪的是有时候接收上万个字节也能接收到。我的代码如下:设置参数为19200,N,8,1
m_com.SetInBufferSize(0x7FFE); //输入缓冲区
m_com.SetOutBufferSize(1024); //输出缓冲区
m_com.SetPortOpen(TRUE); //打开串口
m_com.SetInputMode(1); //以二进制方式检取数据
m_com.SetRThreshold(1);//多于或等于1个字符时,将引发OnComm事件
m_com.SetInputLen(0);//设置当前接收区数据长度为0,表读取全部数据
m_com.GetInput(); //预读以清除数据
OnComm函数主要内容如下:
switch(m_com.GetCommEvent())
case 2:
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
CString strtemp,stringe;
variant_inp=m_com.GetInput();//读取缓冲区
safearray_inp=variant_inp; //VARIANT型变量转为ColeSageArray型变量
len=safearray_inp.GetOneDimSize();//得到有效数据长度
for(k=0;k <len;k++)
{
safearray_inp.GetElement(&k,rxdata+m_readLen+k);//转为BYTE型数组
}
m_readLen=m_readLen+len;
//接收的数据已经存到rxdata数组中
//检查数据格式对否
if(CheckData(rxdata,m_readLen))//这里经常难以通过。。。
{
for(k=0;k <m_readLen;k++)
{
g_recevData[k]=rxdata[k]; //转存到全局数组
}
m_com.SetInBufferCount(0); //(添加)清空接收缓冲区内容等待下次接收
m_readLen=0; //转存完毕后,将m_readLen设为0;
sArrive=TRUE; //设置可以读标志
}
else
{
AfxMessageBox( "数据检查不通过 ");
}
break;
}
default:
break;
}
这里还有个问题,有时候如果第一次接收没有成功,则下次再接收另外一组数据也难以成功,从而导致验证数据格式也失败!对应MSComm控件接收大数据问题,大家有什么好的方法啊?
作者: zzf19870622 发布时间: 2011-12-16
很少用mscomm,直接用api来的比较简单方便.
作者: yjz1409276 发布时间: 2011-12-16
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28