zoukankan      html  css  js  c++  java
  • 两串口收发测试

    这里我们用两个串口分别将RX与TX短接,用来测试收发收发正常。

    因为收发长度不确定因素,我们设定当接收到1个或1个以上字节时,事件触发。由于我们不清楚什么时候一包数据接收完成或者超时没成功接收,我们需要用一个定时器来做时间处理。

    这里我们分别用3个定时,定时器1做串口1接收时间定时,定时器2做串口2接收时间定时,串口3为接收超时定时。

    1               str = "this is a dummy string.hello world.
    ";
    2               m_mscomm2.put_Output(COleVariant(str));
    3               str = "this is the first greetings: Hello world.
    ";
    4               m_mscomm1.put_Output(COleVariant(str));
    5               SetTimer(3, 100, NULL);

    当接收事件触发,开启定时器1或定时器2,并及时将数据分别存储于全局变量中:

     1 void CMicrohardTestDlg::OnCommMscomm1()
     2 {
     3     // TODO: Add your message handler code here
     4     long i;
     5     VARIANT variant_inp;
     6     COleSafeArray safearray_inp;
     7     DWORD len;
     8     BYTE vdata;
     9     if (m_mscomm1.get_CommEvent() == 2)
    10     {
    11         if (msc1_strRX.IsEmpty())
    12         {
    13             SetTimer(1, 20, NULL);
    14         }
    15         //read rx buffer
    16         variant_inp = m_mscomm1.get_Input();
    17         ////VARIANT to COleSafeArray calss
    18         safearray_inp = variant_inp;
    19         //get the active length of data byte
    20         len = safearray_inp.GetOneDimSize();
    21         
    22         for (i = 0; i < (long)len; i++)
    23         {
    24             safearray_inp.GetElement(&i, &vdata);
    25             msc1_strRX += vdata;
    26         }
    27     }
    28 }
    29 
    30 
    31 void CMicrohardTestDlg::OnCommMscomm2()
    32 {
    33     // TODO: Add your message handler code here
    34     long i;
    35     VARIANT variant_inp;
    36     COleSafeArray safearray_inp;
    37     DWORD len;
    38     BYTE vdata;
    39     if (m_mscomm2.get_CommEvent() == 2)
    40     {
    41         if (msc2_strRX.IsEmpty())
    42         {
    43             SetTimer(2, 20, NULL);
    44         }
    45         //read rx buffer
    46         variant_inp = m_mscomm2.get_Input();
    47         ////VARIANT to COleSafeArray calss
    48         safearray_inp = variant_inp;
    49         //get the active length of data byte
    50         len = safearray_inp.GetOneDimSize();
    51         for (i = 0; i < (long)len; i++)
    52         {
    53             safearray_inp.GetElement(&i, &vdata);
    54             msc2_strRX += vdata;
    55         }
    56     }
    57 }
    OnCommMscomm

    最后添加我们的定时器处理:

     1 void CMicrohardTestDlg::OnTimer(UINT_PTR nIDEvent)
     2 {
     3     // TODO: Add your message handler code here and/or call default
     4     switch (nIDEvent)
     5     {
     6     case 1:
     7     {
     8               m_Edit1_show += msc1_strRX;
     9               if (msc1_strRX.Find(_T("world")) != -1)
    10               {
    11                   g_w_Result |= 1;
    12                   m_Edit1_show += _T("第一个串口接收成功!
    
    ");
    13                   if (g_w_Result == 3)
    14                   {
    15                       m_Edit1_show += _T("串口测试完成.
    
    ");
    16                       SetDlgItemText(IDC_BUTTON1, _T("网络测试"));
    17                       KillTimer(3);
    18                       g_w_Steps++;
    19                   }
    20               }
    21               else
    22               {
    23                   m_Edit1_show += _T("第一个串口接收失败!请重试!
    
    ");
    24               }
    25               msc1_strRX = "";
    26               UpdateData(FALSE);
    27               KillTimer(1);
    28               break;
    29     }
    30     case 2:
    31     {
    32               m_Edit1_show += msc2_strRX;
    33               if (msc2_strRX.Find(_T("world")) != -1)
    34               {
    35                   g_w_Result |= 2;
    36                   m_Edit1_show += _T("第二个串口接收成功!
    
    ");
    37                   if (g_w_Result == 3)
    38                   {
    39                       m_Edit1_show += _T("串口测试完成.
    
    ");
    40                       SetDlgItemText(IDC_BUTTON1, _T("网络测试"));
    41                       KillTimer(3);
    42                       g_w_Steps++;
    43                   }
    44               }
    45               else
    46               {
    47                   m_Edit1_show += _T("第二个串口接收失败!请重试!
    
    ");
    48               }
    49               msc2_strRX = "";
    50               UpdateData(FALSE);
    51               KillTimer(2);
    52               break;
    53     }
    54     case 3:
    55     {
    56               if (msc1_strRX.IsEmpty() && (msc2_strRX.IsEmpty()))
    57               {
    58                   m_Edit1_show += _T("串口测试失败!未接收到数据,超时退出...
    
    ");
    59               }
    60               UpdateData(FALSE);
    61               KillTimer(3);
    62               break;
    63     }
    64     default:
    65         break;
    66     }
    67     CDialogEx::OnTimer(nIDEvent);
    68 }
    OnTimer

    注意,执行完相应的定时操作后,及时关闭相应定时器。避免重复进入定时器处理函数。

    谢谢。

    End.

  • 相关阅读:
    UIautomator Python测试
    selenium提供了三种模式的断言:assert,verify,waitfor
    编译标志
    模块级函数
    执行匹配
    反斜杠
    正则表达式
    重复
    字符匹配
    贪婪 vs 不贪婪
  • 原文地址:https://www.cnblogs.com/lumao1122-Milolu/p/12982082.html
Copyright © 2011-2022 走看看