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

转载 2005年03月02日 18:32:00

VC串口控件编程,解决内存不断增加的问题
 
作者姓名: 王潮杰   如需转载使用请与作者联系 

chaojie2003@yahoo.com.cn

 

 




开发环境: VC6 Windows 2000 


讲解: 很多人在使用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;

Vc 串口编程 Win32 控件

在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便易行,应用广泛。 一般情况下,工控机和各智能仪表通过RS485总线进行通信。RS485的通信方...
  • bbdxf
  • bbdxf
  • 2013年04月28日 09:35
  • 938

深入浅出VC++串口编程之基于控件

深入浅出VC++串口编程之基于控件源代码下载   MSComm控件   Visual C++为我们提供了一种好用的ActiveX控件Microsoft Communications Contr...

vc串口通讯控件MSComm编程—No.1

该博客旨在分享IT技术心得,以下是新浪博客地址http://blog.sina.com.cn/qianyumolu,则为分享经济、行业趋势、心灵文章等,有兴趣的朋友可以踩踩,讨论分享 -----...
  • lupopo
  • lupopo
  • 2014年03月18日 17:37
  • 702

基于控件的VC串口编程

1.MSComm控件 Visual C++为我们提供了一种好用的ActiveX控件Microsoft Communications Control(即MSComm)来支持应用程序对串口的访问,在...
  • neuq521
  • neuq521
  • 2013年02月07日 22:54
  • 1564

深入浅出VC++串口编程--基于控件

深入浅出VC++串口编程之基于控件源代码下载MSComm控件  Visual C++为我们提供了一种好用的ActiveX控件Microsoft Communications Control(即MSCo...

关于VC串口控件MSComm响应中断函数次数不定的问题

设置函数:  m_ComPort.SetRThreshold(1);//接收缓冲区有大于等于1个字符时,将引发接收数据的OnCommMscomm事件 此函数并不是说串口来一个数据就会进中断处理...

win7 64位VC串口控件打不开解决方法

写了个MSComm的串口通信程序,在没有安装Vc的机器上没有办法运行。需要手动注册控件。不过手动注册可以写成bat文件来完成。首先是建一个文件夹,64位系统将Windows/SysWOW64(32位系...
  • sunymen
  • sunymen
  • 2015年08月31日 13:28
  • 2690

Windows_VC_串口控件编程

  • 2009年10月17日 00:57
  • 3.58MB
  • 下载

在Delphi环境下基于SPCOMM控件开发串口通讯报文字节丢失的问题解决

最近做的工具需要直接与下位机进行HEXs
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VC串口控件编程,解决内存不断增加的问题
举报原因:
原因补充:

(最多只允许输入30个字)