首页 > 代码库 > MFC下对串口的操作以及定时器的调用
MFC下对串口的操作以及定时器的调用
最近研究了一下MFC下对串口的操作,测试了一下对设备的读写。
1.打开串口
1 GetDlgItem(IDC_BUTTON_OPEN)->EnableWindow(FALSE); 2 m_hComm = CreateFile("COM1", 3 GENERIC_READ | GENERIC_WRITE, 4 0, 5 NULL, 6 OPEN_EXISTING, 7 0, 8 NULL); 9 if (m_hComm == INVALID_HANDLE_VALUE)10 {11 TCHAR szBuf[1024];12 wsprintf(szBuf,_T("打开COM1失败,代码:%d"),GetLastError());13 return;14 }
2.设置串口通讯参数
1 DCB dcb; 2 memset(&dcb,0,sizeof(dcb)); 3 if (!::GetCommState(m_hComm,&dcb)) 4 { 5 return; 6 } 7 dcb.BaudRate = 9600; 8 dcb.fParity = 1; 9 dcb.Parity = 0;10 dcb.ByteSize = 8;11 dcb.StopBits = 0;12 SetCommState(m_hComm,&dcb);13 14 if (!::SetupComm(m_hComm,1024,1024))15 {16 return;17 }
3.设定超时
1 //设定读超时 2 m_CommTimeOuts.ReadIntervalTimeout=MAXDWORD; 3 m_CommTimeOuts.ReadTotalTimeoutMultiplier=0; 4 m_CommTimeOuts.ReadTotalTimeoutConstant=0; 5 //在读一次输入缓冲区的内容后读操作就立即返回, 6 //而不管是否读入了要求的字符。 7 //设定写超时 8 m_CommTimeOuts.WriteTotalTimeoutMultiplier=100; 9 m_CommTimeOuts.WriteTotalTimeoutConstant=500; 10 ::SetCommTimeouts(m_hComm,&(m_CommTimeOuts)); //设置超时11 ::PurgeComm(m_hComm,PURGE_RXCLEAR | PURGE_TXABORT);
4.开一个线程
1 m_pScanThread = AfxBeginThread(ScanThreadProc,this);
5.设置定时器
快捷键Ctrl+W在MessageMaps添加消息响应
1 void CTestDAMDADlg::OnTimer(UINT nIDEvent) 2 { 3 // TODO: Add your message handler code here and/or call default 4 //AfxMessageBox("Begin"); 5 switch (nIDEvent) 6 { 7 case TIMER_2: 8 { 9 //AfxMessageBox("Begin");10 OnButton2v();11 WriteComm(LENID,offlen);12 KillTimer(TIMER_2);13 SetTimer(TIMER_4,5000,NULL);14 break;15 } 16 case TIMER_4:17 {18 OnButton4v();19 WriteComm(LENID,offlen);20 KillTimer(TIMER_4);21 SetTimer(TIMER_6,5000,NULL);22 break;23 } 24 case TIMER_6:25 {26 OnButton6v();27 WriteComm(LENID,offlen);28 KillTimer(TIMER_6);29 SetTimer(TIMER_8,5000,NULL);30 break;31 }32 33 case TIMER_8:34 {35 OnButton8v();36 WriteComm(LENID,offlen);37 KillTimer(TIMER_8);38 SetTimer(TIMER_10,5000,NULL);39 break;40 } 41 case TIMER_10:42 {43 OnButton10v();44 WriteComm(LENID,offlen);45 KillTimer(TIMER_10);46 SetTimer(TIMER_2,5000,NULL);47 break;48 }49 50 default:51 {52 OnButton6v();53 WriteComm(LENID,offlen);54 KillTimer(TIMER_2);55 SetTimer(TIMER_4,5000,NULL);56 break; 57 } 58 }59 CDialog::OnTimer(nIDEvent);60 }
线程里开启定时器
1 dlg->SetTimer(TIMER_2,5000,NULL);
6.调用写串口操作
1 BOOL CTestDAMDADlg::WriteComm(BYTE *lpByte,DWORD dwBytes) 2 { 3 DWORD dwBytesWrite = 20; 4 COMSTAT ComStat; 5 DWORD dwErrorFlags; 6 BOOL bWriteStat; 7 ClearCommError(m_hComm,&(dwErrorFlags),&(ComStat)); 8 bWriteStat = WriteFile(m_hComm,lpByte,dwBytes, 9 &dwBytesWrite,NULL);10 if (!bWriteStat)11 {12 return FALSE;13 }14 else15 {16 return TRUE;17 }18 }
读串口操作类似,这样就完成了定时对串口的读写操作,测试通过!
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。