【文件属性】:
文件名称:定时器的用法的心得体会
文件大小:68KB
文件格式:DOC
更新时间:2014-01-13 16:11:09
Timer
在ClassWizard中响应ID为~Dlg中的WM_TIMER消息。
使用SetTimer(nIDEvent,time,NULL)来建立一个定时器,关闭定时器用KillTimer(nIDEvent)函数。
然后可以响应ON_WM_TIMER消息来响应一个定时器完成一次记时后的程序。
响应方式如下:
void CTimeDlg::OnTimer(UINT nIDEvent)
{
if(nIDEvent==1000)//间隔为5秒
{
//处理事件
}
elseif(nIDEvent==1001)//间隔为10秒
{
//处理事件
}
CDialog::OnTimer(nIDEvent);
}
以下是给出一个串口通信定时检查接收数据的部分代码
void CMyDlg::OnOpenCom()
{
// TODO: Add your control notification handler code here
if( f_open_com==true )
{
f_open_com = false;
GetDlgItem(IDC_OPEN_COM)->SetWindowText("打开通信端口");
CloseHandle(hComm);
KillTimer(1000); /// 关闭定时器
return ;
}
SetTimer(1000, 1000, NULL); ///nIDEvent==1000,time=5000ms
const char *ComNo;
DCB dcb;
string temp("COM1");
ComNo = temp.c_str();
hComm = CreateFile( ComNo , GENERIC_READ|GENERIC_WRITE ,
0 , NULL , OPEN_EXISTING , 0 , 0);
if( hComm==INVALID_HANDLE_VALUE ) /// 如果端口未打开
{
MessageBox("打开通信端口出错!" , "Comm Error" , MB_OK);
return ;
}
/// 将dcb地址传入,以取得通信参数
GetCommState(hComm,&dcb); /// 得知目前通信状态
dcb.BaudRate = CBR_9600;
dcb.ByteSize = 8; /// 字节为8
dcb.Parity = NOPARITY; /// Parity为None
dcb.StopBits = ONESTOPBIT; /// 1个停止位
if( !SetCommState( hComm , &dcb)){
MessageBox("通信端口设置出错!" , "Set Error" , MB_OK );
CloseHandle(hComm);
return;
}
GetDlgItem(IDC_OPEN_COM)->SetWindowText("关闭通信端口");
f_open_com = true;
}
void CMyDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
char inbuff[1024];
DWORD nBytesRead , dwError;
COMSTAT cs;
/// 取得状态
ClearCommError( hComm , &dwError , &cs);
/// 数据是否大于所准备的缓冲区
if( cs.cbInQue > sizeof(inbuff) )
{
PurgeComm(hComm , PURGE_RXCLEAR ); /// 清除通信端口数据
return ;
}
ReadFile(hComm , inbuff , cs.cbInQue , &nBytesRead , NULL ); //接收通信端口的数据
inbuff[cs.cbInQue] = '\0';
MessageBox("打开通信端口出错!" , "Comm Error" , MB_OK);
m_Receive.Format("%s",inbuff);
UpdateData(false);
CDialog::OnTimer(nIDEvent);
}
李杨:
for(int i=0; ;i++ )
{
...
Sleep(5);
if(i>...) {AfxMessageBox("错误XXX"); return;}
}//跳出后记得停止一些机器动作