ソースを参照

【软件版本】
V
【模块名称】
远程场测工具
【问题原因】
1、USB切换模块加入;2、自动识别USB切换模块串口号;
【修改描述】

【测试结果】

sat23 3 年 前
コミット
4785eee8d0

+ 3 - 0
TestWizardTool/TestWizardTool/Global.cpp

@@ -254,6 +254,9 @@ namespace Global
 		GetPrivateProfileString(_T("TestWizard"), _T("Com"), NULL, szValue, MAX_PATH, szConfigpath);
         g_Config.twPort = szValue;
 
+        GetPrivateProfileString(_T("Switcher"), _T("Com"), NULL, szValue, MAX_PATH, szConfigpath);
+        g_Config.switchPort = szValue;
+
         if ( !PathFileExists(g_Config.twSignaldir.c_str()) )
             MKDIR(g_Config.twSignaldir.c_str());
     }

+ 2 - 0
TestWizardTool/TestWizardTool/Global.h

@@ -39,6 +39,8 @@ namespace Global
 		std::string twSignaldir;
 		std::string twUseSignal;
         std::string twOldSignaldir;
+        // uÅÌÇл»É豸;
+        std::string switchPort;
 	}STConfig, * pSTConfig;
 
 	//////////////////////////////////////////////////////////////////////////

+ 2 - 2
TestWizardTool/TestWizardTool/TestWizardTool.rc

@@ -101,8 +101,8 @@ BEGIN
     GROUPBOX        "",IDC_STATIC_GROUP,7,2,206,42
     COMBOBOX        COMBO_COM2,10,29,38,85,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP
     PUSHBUTTON      "Open",BTN_OPEN_COM2,49,28,29,14
-    CONTROL         "Switch A",IDC_CHECK_A,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,83,31,44,10
-    CONTROL         "Switch B",IDC_CHECK_B,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,128,31,43,10
+    CONTROL         "Switch A",IDC_CHECK_A,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,83,31,44,10
+    CONTROL         "Switch B",IDC_CHECK_B,"Button",BS_AUTOCHECKBOX | WS_DISABLED | WS_TABSTOP,128,31,43,10
 END
 
 

+ 154 - 0
TestWizardTool/TestWizardTool/TestWizardToolDlg.cpp

@@ -12,6 +12,7 @@
 
 #define MINIMUM_WINDOWS_X 395  
 #define MINIMUM_WINDOWS_Y 535
+#define MAX_SWITCH_LEN 16
 
 unsigned char TwoHexChar2Char(char ch1, char ch2)
 {
@@ -138,6 +139,7 @@ CTestWizardToolDlg::CTestWizardToolDlg(CWnd* pParent /*=NULL*/)
     m_nDefaultWidth = 360;
     m_nDefaultHeight = 600;
     m_bFindTestWizardPort = false;
+    m_bFindSwitcherPort = false;
 }
 
 void CTestWizardToolDlg::DoDataExchange(CDataExchange* pDX)
@@ -169,6 +171,8 @@ BEGIN_MESSAGE_MAP(CTestWizardToolDlg, CDialog)
     ON_WM_DESTROY()
     ON_WM_TIMER()
     ON_BN_CLICKED(BTN_OPEN_COM2, &CTestWizardToolDlg::OnBnClickedOpenCom2)
+    ON_BN_CLICKED(IDC_CHECK_A, &CTestWizardToolDlg::OnBnClickedCheckA)
+    ON_BN_CLICKED(IDC_CHECK_B, &CTestWizardToolDlg::OnBnClickedCheckB)
 END_MESSAGE_MAP()
 
 
@@ -318,9 +322,11 @@ BOOL CTestWizardToolDlg::OnDeviceChange(UINT nEventType, DWORD_PTR dwData)
 void CTestWizardToolDlg::InitSerialCombobox()
 {
     m_cbCOMTW.ResetContent();
+    m_cbUSBPort.ResetContent();
     for (std::vector<std::string>::iterator it = m_vtPorts.begin(); it != m_vtPorts.end(); it++) 
     {
         m_cbCOMTW.AddString(it->c_str());
+        m_cbUSBPort.AddString(it->c_str());
     }
 }
 
@@ -1026,6 +1032,80 @@ bool CTestWizardToolDlg::IsTestWizardPort(CString strCOMPort)
     return false;
 }
 
+bool CTestWizardToolDlg::IsUSBSwitchPort(CString strCOMPort)
+{
+    CString strText = _T("");
+    GetDlgItemText(BTN_OPEN_COM2, strText);
+    if ( strText == _T("Close") )
+    {// 串口已打开;
+        return false;
+    }
+
+    /* 
+       发送:
+            *SET PORT A\r 
+       返回:
+            set PORT A\r\n 
+    */
+    m_SerialUSB.SetIOMode();
+    if ( m_SerialUSB.Open(atol(strCOMPort.Mid(3).GetString()), 115200) )
+    {
+        // 快速响应读写,不需要设置过长的超时;
+        m_SerialUSB.SetTimeouts(0,1,20,1,150);
+        // 封装发送包;
+        byte szSendData[MAX_PATH] = _T("*SET PORT A\r");
+        if ( m_SerialUSB.WriteSync(szSendData, _tcslen((TCHAR*)szSendData)) )
+        {
+            memset(szSendData, 0, MAX_PATH);
+            m_SerialUSB.ReadSync(szSendData, MAX_PATH);
+            if ( _tcscmp((TCHAR*)szSendData, _T("set PORT A\r\n")) == 0 )
+            {
+                // 设置当前串口为选中状态;
+                m_cbUSBPort.SelectString(0, strCOMPort);
+                Global::g_Config.switchPort = strCOMPort;
+                WritePrivateProfileString("Switcher", "Com", strCOMPort.GetString(), Global::g_szConfig);
+                // SetDlgItemText(BTN_OPEN_COM, _T("Close"));
+                // m_cbCOM.EnableWindow(FALSE);
+                // 关闭后,重新打开在设置超时值;
+                m_SerialUSB.Close();
+                return true;
+            }
+            TRACE("发送单信号成功\n");
+        }
+        else
+        {
+            TRACE("发送单信号失败\n");
+        }
+
+        m_SerialUSB.Close();
+    }
+
+    return false;
+}
+
+void CTestWizardToolDlg::SwitchUSB(BOOL bCheckA)
+{
+    if ( m_SerialUSB.IsOpen() )
+    {
+        m_SerialUSB.SetTimeouts(0,2,50,1,150);
+        // 封装发送包;
+        byte szSendData[MAX_SWITCH_LEN] = {0};
+        _stprintf_s((TCHAR*)szSendData, MAX_SWITCH_LEN, _T("*SET PORT %c\r"), bCheckA ? 'A':'B');
+
+        // 发送单信号;
+        if ( m_SerialUSB.WriteSync(szSendData, _tcslen((TCHAR*)szSendData)) )
+        {
+            memset(szSendData, 0, MAX_SWITCH_LEN);
+            m_SerialUSB.ReadSync(szSendData, MAX_SWITCH_LEN);
+            TRACE("切换U盘成功\n");
+        }
+        else
+        {
+            TRACE("切换U盘失败\n");
+        }
+    }
+}
+
 void CTestWizardToolDlg::OnTimer(UINT_PTR nIDEvent)
 {
     // TODO: 在此添加消息处理程序代码和/或调用默认值
@@ -1042,11 +1122,30 @@ void CTestWizardToolDlg::OnTimer(UINT_PTR nIDEvent)
                 {
                     m_bFindTestWizardPort = IsTestWizardPort(it->c_str());
                 }
+
+                if ( !m_bFindSwitcherPort )
+                {
+                    m_bFindSwitcherPort = IsUSBSwitchPort(it->c_str());
+                }
             }
 
             if ( !m_bFindTestWizardPort )
                 MessageBox(_T("No Test Wizard found"), _T("Prompt"), MB_OK);
         }
+
+        if ( CB_ERR == m_cbUSBPort.SelectString(0, Global::g_Config.switchPort.c_str()) )
+        {
+            for (std::vector<std::string>::iterator it = m_vtPorts.begin(); it != m_vtPorts.end(); it++) 
+            {
+                if ( !m_bFindSwitcherPort )
+                {
+                    m_bFindSwitcherPort = IsUSBSwitchPort(it->c_str());
+                }
+            }
+
+            if ( !m_bFindSwitcherPort )
+                MessageBox(_T("No USB Switcher found"), _T("Prompt"), MB_OK);
+        }
     }
 
     CDialog::OnTimer(nIDEvent);
@@ -1055,4 +1154,59 @@ void CTestWizardToolDlg::OnTimer(UINT_PTR nIDEvent)
 void CTestWizardToolDlg::OnBnClickedOpenCom2()  // 打开USB模块串口;
 {
     // TODO: 在此添加控件通知处理程序代码
+    CString strText = _T("");
+    GetDlgItemText(BTN_OPEN_COM2, strText);
+    if ( strText == _T("Open") )
+    {
+        int nCurSel = m_cbUSBPort.GetCurSel();
+        if ( nCurSel != CB_ERR ) 
+        {
+            m_SerialUSB.SetIOMode();
+            m_cbUSBPort.GetLBText(nCurSel,strText);
+            if ( m_SerialUSB.Open(atol(strText.Mid(3).GetString()), 115200) )
+            {
+                SetDlgItemText(BTN_OPEN_COM2, _T("Close"));
+                m_cbUSBPort.EnableWindow(FALSE);
+                m_SerialUSB.SetBufferSize(1024,1024);
+                WritePrivateProfileString("Switcher", "Com", strText.GetString(), Global::g_szConfig);
+
+                // 启用复选框;
+                GetDlgItem(IDC_CHECK_A)->EnableWindow();
+                GetDlgItem(IDC_CHECK_B)->EnableWindow();
+            }
+        }
+    }
+    else
+    {
+        m_cbUSBPort.EnableWindow();
+        SetDlgItemText(BTN_OPEN_COM2, _T("Open"));
+        if ( m_SerialUSB.IsOpen() )
+            m_SerialUSB.Close();
+
+        // 启用复选框;
+        GetDlgItem(IDC_CHECK_A)->EnableWindow(FALSE);
+        GetDlgItem(IDC_CHECK_B)->EnableWindow(FALSE);
+    }
+}
+
+void CTestWizardToolDlg::OnBnClickedCheckA()
+{
+    // TODO: 在此添加控件通知处理程序代码
+    CButton *pChckA = (CButton*)GetDlgItem(IDC_CHECK_A);
+    BOOL bChecA = pChckA->GetCheck();
+    
+    pChckA->SetCheck(bChecA);
+    ((CButton*)GetDlgItem(IDC_CHECK_B))->SetCheck(!bChecA);
+    SwitchUSB(bChecA);
+}
+
+void CTestWizardToolDlg::OnBnClickedCheckB()
+{
+    // TODO: 在此添加控件通知处理程序代码
+    CButton *pChckB = (CButton*)GetDlgItem(IDC_CHECK_B);
+    BOOL bChecB = pChckB->GetCheck();
+
+    pChckB->SetCheck(bChecB);
+    ((CButton*)GetDlgItem(IDC_CHECK_A))->SetCheck(!bChecB);
+    SwitchUSB(!bChecB);
 }

+ 7 - 0
TestWizardTool/TestWizardTool/TestWizardToolDlg.h

@@ -91,8 +91,13 @@ public:
     CRect m_rcGroup;
     // 是否找到测试精灵串口;
     bool m_bFindTestWizardPort;
+    // 是否找到u盘切换设备;
+    bool m_bFindSwitcherPort;
     // 查找测试精灵串口;
     bool IsTestWizardPort(CString strCOMPort);
+    // 查找USB切U盘设备串口
+    bool IsUSBSwitchPort(CString strCOMPort);
+    void SwitchUSB(BOOL bCheckA);
 
     void AdjustLayout();
     void InitSerialCombobox();
@@ -131,4 +136,6 @@ public:
     virtual BOOL PreTranslateMessage(MSG* pMsg);
     afx_msg void OnTimer(UINT_PTR nIDEvent);
     afx_msg void OnBnClickedOpenCom2();
+    afx_msg void OnBnClickedCheckA();
+    afx_msg void OnBnClickedCheckB();
 };

+ 2 - 2
TestWizardTool/TestWizardTool/resource.h

@@ -16,8 +16,8 @@
 #define COMBO_COM2                      1005
 #define BTN_OPEN_COM2                   1006
 #define IDC_CHECK_A                     1007
-#define IDC_CHECK2                      1008
 #define IDC_CHECK_B                     1008
+#define IDC_RADIO1                      1009
 
 // Next default values for new objects
 // 
@@ -25,7 +25,7 @@
 #ifndef APSTUDIO_READONLY_SYMBOLS
 #define _APS_NEXT_RESOURCE_VALUE        129
 #define _APS_NEXT_COMMAND_VALUE         32771
-#define _APS_NEXT_CONTROL_VALUE         1008
+#define _APS_NEXT_CONTROL_VALUE         1010
 #define _APS_NEXT_SYMED_VALUE           101
 #endif
 #endif