• 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     else
    15     {
    16         return TRUE;
    17     }
    18 }

    读串口操作类似,这样就完成了定时对串口的读写操作,测试通过!

  • 相关阅读:
    ubuntu16.04本地软件源搭建
    2080TI显卡ubuntu16.04机器学习安装和克隆
    PLSQL导入excel数据方法
    只有英伟达显卡输出口的电脑安装ubuntu系统记录
    百度人脸识别学习
    http application/x-www-form-urlencoded 模式响应学习
    JS中继承的几种实现方式
    浅拷贝和深拷贝
    防抖和节流
    HTML知识点总结
  • 原文地址:https://www.cnblogs.com/wanzaiyimeng/p/3885468.html
Copyright © 2020-2023  润新知