我写了一个串口通信程序,主要是给设备发一个命令,然后读取其返回的信息,设置2个定时器每一秒发命令,每2秒读信息
问题是,运行时所占内存一直增大!!!!!我用的是CSerialPort类写的
关键代码如下:
SetTimer(123,2000,NULL);//读取返回信息定时器
SetTimer(456,1000,NULL);//发送命令定时器CStringArray card;//存储卡号
void CKJShowDlg::OnTimer(UINT nIDEvent) 
{
/*******************************************************************
读取返回信息截取卡号部分,根据卡号访问数据库,显示人员详细信息
*******************************************************************/
if(nIDEvent==123)
{

if(ReturnStr.IsEmpty())//ReturnStr是返回的字符串信息
{
KillTimer(123);
AfxMessageBox("无返回数据,请确认串口和分站地址是否正确");
m_btnOpenPort.EnableWindow(TRUE);
m_Com.EnableWindow(TRUE);
m_editAddr.EnableWindow(TRUE);
return;
}
//截取字符串
strMid=ReturnStr.Mid(30);
//除去字符串中的空格
strMid.Remove(' ');
//截取卡号部分
strMid=strMid.Left(strMid.GetLength()-4);
//每四个字符为一个卡号,将其存入CStringArray定义的字符串数组里
//////////////////////////////////////////////////
//设置数组大小
card.SetSize(strMid.GetLength()/4);
for(int i=0;i<strMid.GetLength();i+=4)
{
card.Add(strMid.Mid(i,4));//?????????是不是这有问题
}
///////////////////////////////////////////////////////
//访问数据库
m_pRecordset.CreateInstance("ADODB.Recordset");
try
{
CString sql="select * from jk_ClerkConfig";
m_pRecordset->Open((_variant_t)sql,_variant_t((IDispatch *)theApp.m_pConnection,true),adOpenDynamic,adLockPessimistic,adCmdText); while(!m_pRecordset->adoEOF)
{
Id = m_pRecordset->Fields->GetItem("Id")->Value.bstrVal;
name=m_pRecordset->Fields->GetItem("Name")->Value.bstrVal;
for(int i=0;i<card.GetSize();i++)
{
if(card[i]==Id)
{
m_ctrlList.InsertItem(a,Id);
m_ctrlList.SetItemText(a,1,name);
a++;
///实现滚屏显示
if(m_chkScroll.GetCheck()==1)
m_ctrlList.EnsureVisible(a-1,TRUE);
if(a==5000)
{
a=0;
m_ctrlList.DeleteAllItems();
}
break;
}
}
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
m_pRecordset.Release();
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("访问数据库失败!\r\n错误信息:%s",(char*)e.Description());
AfxMessageBox(errormessage);///显示错误信息
m_pRecordset->Close();
m_pRecordset.Release();
card.FreeExtra();
card.RemoveAll();
//将返回的字符串重新置零
ReturnStr.Empty();
strMid.Empty();
return ;
}
card.FreeExtra();
card.RemoveAll();
//将返回的字符串重新置零
ReturnStr.Empty();
strMid.Empty();
}
/***************************************
发送读取在线人员信息命令
***************************************/
if(nIDEvent==456)
{
// UpdateData();
//获取当前时间
t=CTime::GetCurrentTime();

//以下转化成命令格式
m_strAddress.Remove(' ');
strH=m_strAddress.Left(2);
strL=m_strAddress.Right(2); 
sscanf(strH,"%x",&H2);
sscanf(strL,"%x",&L2); 
strcommend="FE10";
strcommend += m_strAddress;
strcommend += "0000";
strcommend += m_strAddress;
strcommend += "0000";
strcommend += "040007";

//十进制转化成十六进制字符串,数据位部分   
strtmp.Format("%04X",t.GetYear());
/////////////////////////
strH=strtmp.Left(2);
strL=strtmp.Right(2);  
sscanf(strH,"%x",&H);
sscanf(strL,"%x",&L); 
//////////////////////////////////
strcommend +=strtmp;
strtmp.Format("%02X",t.GetMonth());
strcommend +=strtmp;
strtmp.Format("%02X",t.GetDay());
strcommend +=strtmp;
strtmp.Format("%02X",t.GetHour());
strcommend +=strtmp;
strtmp.Format("%02X",t.GetMinute());
strcommend +=strtmp;
strtmp.Format("%02X",t.GetSecond());
strcommend +=strtmp; //求校验位
checksum=0x10+H2+L2+H2+L2+0x04+0x07+H+L+t.GetMonth()+t.GetDay()+t.GetHour()+t.GetMinute()+t.GetSecond();
check=0xFF-checksum%256+1;   strtmp.Format("%02X",check);
strcommend +=strtmp;
strcommend +="0D";
////////////发送命令
len=StringHex(strcommend,data);
if(!m_bSerialPortOpened) 
return; //检查串口是否打开
m_SerialPort.WriteToPort(data,len);//发送数据 strcommend.Empty();
strtmp.Empty();
strH.Empty();
strL.Empty();
temp.Empty();
CDialog::OnTimer(nIDEvent);
}
////////////////串口接收数据事件函数
LONG CKJShowDlg::OnComm(WPARAM ch, LPARAM port)
{
temp.Format("%02X",ch);
ReturnStr += temp;
return 0;
}