两串口收发测试

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

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

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

1               str = "this is a dummy string.hello world.\r\n";
2               m_mscomm2.put_Output(COleVariant(str));
3               str = "this is the first greetings: Hello world.\r\n";
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("第一个串口接收成功!\r\n\r\n");
13                   if (g_w_Result == 3)
14                   {
15                       m_Edit1_show += _T("串口测试完成.\r\n\r\n");
16                       SetDlgItemText(IDC_BUTTON1, _T("网络测试"));
17                       KillTimer(3);
18                       g_w_Steps++;
19                   }
20               }
21               else
22               {
23                   m_Edit1_show += _T("第一个串口接收失败!请重试!\r\n\r\n");
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("第二个串口接收成功!\r\n\r\n");
37                   if (g_w_Result == 3)
38                   {
39                       m_Edit1_show += _T("串口测试完成.\r\n\r\n");
40                       SetDlgItemText(IDC_BUTTON1, _T("网络测试"));
41                       KillTimer(3);
42                       g_w_Steps++;
43                   }
44               }
45               else
46               {
47                   m_Edit1_show += _T("第二个串口接收失败!请重试!\r\n\r\n");
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("串口测试失败!未接收到数据,超时退出...\r\n\r\n");
59               }
60               UpdateData(FALSE);
61               KillTimer(3);
62               break;
63     }
64     default:
65         break;
66     }
67     CDialogEx::OnTimer(nIDEvent);
68 }
OnTimer

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

 

谢谢。

End.

 

posted on 2020-05-28 17:10  Milo_lu  阅读(677)  评论(0编辑  收藏  举报

导航