最近项目中用到串口接收数据,并把数据显示在编辑框中的代码。程序运行后发现CPU占用率一直增加造成计算机运行卡顿的现象,接收数据的代码如下:
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[4096]; //4096//设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ComData.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ 以下你可以根据自己的通信协议加入处理代码
variant_inp=m_ComData.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
m_strRXData+=strtemp; //加入接收编辑框对应字符串
}
}
UpdateData(FALSE); //更新编辑框内容
逐步调试程序跟踪到代码中的加粗部分
variant_inp=m_ComData.GetInput();
发现每执行一次CPU占用率增加一些,这个代码是串口自己封装的函数应该不会有问题。在网上查找资料发现有两种解决方法。
1、VC++自带的串口控件不好用,应该用串口的API程序。但如果这样做的话会改动很多代码,加大了编程的工作量。
2、把 variant_inp=m_ComData.GetInput(); //读缓冲区
改为
COleVariant myVar;
myVar.Attach (m_ComData.GetInput());
经过测试发现CPU占用率还是一直增加。继续查找资料在接收数据的代码后又添加了一行代码:
VariantClear(&myVar);//清空变量
经过测试发现CPU的占用率不再一直增加了。
总结:在串口读取数据后要调用VariantClear函数清空变量,可以有效防止因为串口读取数据造成的CPU占用率一直增加的问题。