这里我们用两个串口分别将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 }
最后添加我们的定时器处理:

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 }
注意,执行完相应的定时操作后,及时关闭相应定时器。避免重复进入定时器处理函数。
谢谢。
End.