首    页 界面/窗口 网络/通讯 数据库 组件开发 图像/多媒体 NET/Web 其它技术 源码下载 资料下载 软件共享 软件外包 曲艺杂谈
栏目导航:  首    页  |  网络/通讯  |  串口通讯


VC串口控件编程,解决内存不断增加的问题


原作者:chao_jie    源出处:CSDN   发布者:施昌权    发布类型:转载    发布日期:2008-10-24

         

讲解: 很多人在使用VC串口控件编写程序的时候,经常会遇到当串口接受数据量比较大时,从Windows 2000任务管理器里,可以看到程序占用的内存会不断增大,只好转用API从新编写,本文主要解决这个问题.

一般编写串口控件接收数据时,是这样写的:

//初始化设置

m_msComm.SetCommPort(1)//打开COM1
m_msComm.SetPortOpen(true);//打开串口
m_msComm.SetSettings("115200,n,8,1");//串口参数设置  
m_msComm.SetInputMode(1);//comInputModeBinary设置Binary缓冲区输入方式
m_msComm.SetRThreshold(5);//每接收5个字符则激发OnComm()事件
m_msComm.SetInputLen(5);//每次读取5个字符

//接收数据

void CCOMDlg::OnComm()
{
  VARIANT variant_inp;
  COleSafeArray safearray_inp;
  LONG len,k;
  BYTE rxdata[5]; //设置BYTE数组
  CString strtemp;

 switch(m_msComm.GetCommEvent())
  {
  case 2://事件值为2表示接收缓冲区内有字符


   variant_inp=m_msComm.GetInput(); //读缓冲区--------------------------------*


   safearray_inp = variant_inp; //VARIANT型变量转换为ColeSafeArray型变量


   len=safearray_inp.GetOneDimSize(); //验证得到有效数据长度
   assert(len == 5);


   for(k=0;k<len;k++)//len is 5 in normal case
    safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
  
   HandleCommand(rxdata);//这是接收数据处理函数
   break;

 default:
   break;
  }
}

//发送

void CCOMDlg::SendCommand(unsigned char commandID,int para1,int para2)
{
  BYTE strBuf[5],tempbyte;
  CByteArray OutBuf;
  COleVariant varOutput;

 //命令字
  strBuf[0] = commandID;
 
  //地址高位
  tempbyte = (para1>>8) & 0xff;
  strBuf[1] = tempbyte;

 //地址低位
  tempbyte = para1 & 0xff;
  strBuf[2] = tempbyte;

 //数据高位
  tempbyte = (para2>>8) & 0xff;
  strBuf[3] = tempbyte;

 //数据低位
  tempbyte = para2 & 0xff;
  strBuf[4] = tempbyte;

 OutBuf.SetSize(5);
  for(int i=0;i<5;i++)
   OutBuf[i] = strBuf[i];
  varOutput = OutBuf;
  m_msComm.SetOutput(varOutput);
}

问题出在VARIANT型变量上,当执行到*号的这一行时,VARIANT型变量就会使内存增加,可以用下面的方法解决:

void CCOMDlg::OnComm()
{
 
  long len,k;
  COleVariant myVar;
  COleSafeArray safearray_inp;
  BYTE rxdata[5]; //设置BYTE数组

 switch(m_msComm.GetCommEvent())
  {
  case 2://事件值为2表示接收缓冲区内有字符

  myVar.Attach (m_msComm.GetInput());--------------------------------------*

  safearray_inp = myVar;  //COleVariant型变量转换为ColeSafeArray型变量

  len=safearray_inp.GetOneDimSize(); //验证得到有效数据长度
   assert(len == 5);

  for(k=0;k<len;k++)   //len is 5 in normal case
    safearray_inp.GetElement(&k,rxdata+k);   //转换为BYTE型数组
  
   HandleCommand(rxdata); );//这是接收数据处理函数

  break;


关于我们 版权声明 广告服务 联系我们 友情链接 加入收藏
站长:施昌权    Email:scq2099yt@163.com    MSN:scq2099yt@live.cn    QQ:14046300    本站QQ群:67202409
Copyright © 2008     卓为VC(www.joyvc.cn)    All Rights Reserved    建议分辨率 1024×768
本站由施昌权制作维护
京ICP备09012297号