ソースを参照

添加U盘切换按钮、电源控制功能;同时修改串口类的读取方式,使用异步;

sat23 4 年 前
コミット
9b6b6cddfc

+ 159 - 0
SATHelper/SATHelper/CallPython.cpp

@@ -0,0 +1,159 @@
+#include "StdAfx.h"
+#include "CallPython.h"
+
+void InitPython()
+{
+	if ( !Py_IsInitialized() )
+		Py_Initialize();
+}
+
+void FreePython()
+{
+	Py_Finalize();
+}
+
+void PySetItem(PyObject* args, _variant_t var, int nIndex)
+{
+	if ( args == NULL || nIndex < 0 )
+		return;
+
+	switch(var.vt)  
+	{
+	case VT_BSTR:
+		{
+			PyTuple_SetItem(args, nIndex, Py_BuildValue("s", var.bstrVal));
+			break;
+		}
+	case VT_LPSTR:
+		{
+			PyTuple_SetItem(args, nIndex, Py_BuildValue("s", var.bstrVal));
+			break;
+		}
+	case VT_I1:
+		{
+			PyTuple_SetItem(args, nIndex, Py_BuildValue("b", var.cVal));
+			break;
+		}
+	case VT_I2: 
+		{  
+			PyTuple_SetItem(args, nIndex, Py_BuildValue("h", var.iVal));
+			break;  
+		} 
+	case VT_I4:
+		{  
+			PyTuple_SetItem(args, nIndex, Py_BuildValue("i", var.lVal));
+			break;  
+		}  
+	case VT_I8:
+		{  
+			PyTuple_SetItem(args, nIndex, Py_BuildValue("k", var.lVal));
+			break;  
+		}
+	case VT_INT:
+		{
+			PyTuple_SetItem(args, nIndex, Py_BuildValue("i", var.intVal));
+			break;  
+		}
+	case VT_UI1:
+		{
+			PyTuple_SetItem(args, nIndex, Py_BuildValue("B", var.cVal));
+			break;
+		}
+	case VT_UI2:
+		{  
+			PyTuple_SetItem(args, nIndex, Py_BuildValue("H", var.iVal));
+			break;  
+		} 
+	case VT_UI4: 
+		{  
+			PyTuple_SetItem(args, nIndex, Py_BuildValue("I", var.lVal));
+			break;  
+		}  
+	case VT_UI8:
+		{  
+			PyTuple_SetItem(args, nIndex, Py_BuildValue("K", var.lVal));
+			break;  
+		}
+	case VT_UINT:
+		{
+			PyTuple_SetItem(args, nIndex, Py_BuildValue("I", var.intVal));
+			break;  
+		}
+	case VT_R4:
+		{  
+			PyTuple_SetItem(args, nIndex, Py_BuildValue("f", var.fltVal));
+			break;  
+		}  
+	case VT_R8:
+		{  
+			PyTuple_SetItem(args, nIndex, Py_BuildValue("f", var.dblVal));
+			break;  
+		}   
+	case VT_BOOL:
+		{  
+			PyTuple_SetItem(args, nIndex, Py_BuildValue("b", (var.boolVal == false) ? 0: 1));
+			break;  
+		}
+	default:  
+		{  
+			TRACE("UnSupport type for Python: %d\n",var.vt);  
+			break;  
+		}  
+	}
+}
+
+PyObject *CallPython(std::string strPyPath, std::string strPyFuncName, int argc, ...)
+{
+	if ( !PathFileExists(strPyPath.c_str()) || !strPyFuncName.size() )
+		return NULL;
+
+	TCHAR szDrive[_MAX_DRIVE] = { 0 };
+	TCHAR szDir[_MAX_DIR] = { 0 };
+	TCHAR szExt[_MAX_EXT] = { 0 };
+	TCHAR szFilename[_MAX_FNAME] = { 0 };
+	TCHAR szScriptDir[MAX_PATH] = { 0 };
+	_tsplitpath_s(strPyPath.c_str(), szDrive, szDir, szFilename, szExt);
+	_stprintf_s(szScriptDir, _T("%s%s"), szDrive, szDir);
+	int len = _tcslen(szScriptDir);
+	for (int i = 0; i < len; i++) {
+		if (szScriptDir[i] == '\\')
+			szScriptDir[i] = '/';
+	}
+
+	if ( szScriptDir[0] == '\0' )
+		_tcscpy_s(szScriptDir, _T("./"));
+
+	TCHAR szExecuteDir[MAX_PATH] = { 0 };
+	_stprintf_s(szExecuteDir, _T("sys.path.append('%s')"), szScriptDir);
+	PyRun_SimpleString("import sys");
+	PyRun_SimpleString(szExecuteDir);
+
+	PyObject *pModule = PyImport_ImportModule(szFilename);
+	if ( !pModule )
+		return NULL;
+
+	PyObject *pFunc = PyObject_GetAttrString(pModule, strPyFuncName.c_str());
+	if (!pFunc || !PyCallable_Check(pFunc))
+		return NULL;
+
+	PyObject *pRet = NULL;
+	if ( argc != 0 ) {		
+		va_list ap;
+		va_start(ap, argc); 
+		PyObject *args = PyTuple_New(argc);
+		if ( !args ) {
+			va_end(ap);
+			return NULL;
+		}
+
+		for ( int i = 0; i < argc; i++ ) {
+			PySetItem(args, va_arg(ap, _variant_t), i);
+		}
+		va_end(ap);
+		pRet = PyObject_CallObject(pFunc, args);
+	}
+	else
+		pRet = PyEval_CallObject(pFunc, NULL);
+
+	return pRet;
+}

+ 14 - 0
SATHelper/SATHelper/CallPython.h

@@ -0,0 +1,14 @@
+#ifndef __CALL_PYTHON__
+#define __CALL_PYTHON__
+
+#include "Python.h"
+#include <comdef.h>
+
+// 初始化Python调用环境;
+extern "C" void InitPython();
+// 调用Python脚本指定函数;
+extern "C" PyObject* CallPython(std::string strPyPath, std::string strPyFuncName, int argc, ...);
+// 释放Python调用环境;
+extern "C" void FreePython();
+
+#endif

+ 1 - 0
SATHelper/SATHelper/Global.cpp

@@ -346,6 +346,7 @@ namespace Global
 		// uÅÌÇл»;
 		g_Config.usbPort = GetPrivateProfileInt(_T("UsbSwitch"), _T("Com"), 0, szConfigpath);
 		g_Config.enableUSB = GetPrivateProfileInt(_T("SATHelper"), _T("enableUSB"), 0, szConfigpath);
+		g_Config.nPowerLanIndex = GetPrivateProfileInt(_T("PowerCtrl"), _T("LanIndex"), 0, szConfigpath);
 	}
 
 	BOOL GetOrientation(IN Image* pImg)

+ 3 - 0
SATHelper/SATHelper/Global.h

@@ -61,6 +61,9 @@ namespace Global
 		// UB530
 		bool bAutoReconnect;			// 是否启用自动重连;
 		int  nReconnectCycle;			// 重连周期;
+
+		// 电源控制Lan;
+		int nPowerLanIndex;
 	}STConfig, * pSTConfig;
 
 	// 读取baidu.cfg配置文件内容;

+ 123 - 16
SATHelper/SATHelper/MainFrm.cpp

@@ -106,6 +106,12 @@ BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWndEx)
 	ON_UPDATE_COMMAND_UI(ID_COMBO_USB, &CMainFrame::OnUpdateComboUsb)
 	ON_COMMAND(ID_CHECK_USB, &CMainFrame::OnCheckUsb)
 	ON_UPDATE_COMMAND_UI(ID_CHECK_USB, &CMainFrame::OnUpdateCheckUsb)
+	ON_COMMAND(ID_SWITCH_USB, &CMainFrame::OnSwitchUsb)
+	ON_UPDATE_COMMAND_UI(ID_SWITCH_USB, &CMainFrame::OnUpdateSwitchUsb)
+	ON_COMMAND(ID_COMBO_POWER, &CMainFrame::OnComboPower)
+	ON_UPDATE_COMMAND_UI(ID_COMBO_POWER, &CMainFrame::OnUpdateComboPower)
+	ON_COMMAND(ID_POWER_CTRL, &CMainFrame::OnPowerCtrl)
+	ON_UPDATE_COMMAND_UI(ID_POWER_CTRL, &CMainFrame::OnUpdatePowerCtrl)
 END_MESSAGE_MAP()
 
 // CMainFrame 构造/析构
@@ -1074,8 +1080,7 @@ void CMainFrame::RunDevice()
 	CMFCRibbonButton* pCheck1 = DYNAMIC_DOWNCAST(CMFCRibbonButton, pRibbon->FindByID(ID_CHECK1_22293));
 	CMFCRibbonButton* pCheck2 = DYNAMIC_DOWNCAST(CMFCRibbonButton, pRibbon->FindByID(ID_CHECK2_22293));
 
-	if (Global::g_rscfg.chroma1.size())
-	{
+	if (Global::g_rscfg.chroma1.size()) {
 		CDevice* pdev = new CDevice();
 		pdev->m_iBaudrate = 115200;
 		pdev->m_iDatabit = 8;
@@ -1095,8 +1100,7 @@ void CMainFrame::RunDevice()
 		}
 	}
 
-	if (Global::g_rscfg.chroma2.size())
-	{
+	if (Global::g_rscfg.chroma2.size()) {
 		CDevice* pdev = new CDevice();
 		pdev->m_iBaudrate = 115200;
 		pdev->m_iDatabit = 8;
@@ -1128,6 +1132,7 @@ void CMainFrame::InitCombobox_port()
 	CMFCRibbonComboBox* pCommboxTV = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_TVPORT));
 	CMFCRibbonComboBox* pCommboxTW = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_TWPORT));
 	CMFCRibbonComboBox* pCommboxUSB = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_USB));
+	CMFCRibbonComboBox* pCommboxPower = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_POWER));
 	for (std::vector<std::string>::iterator it = m_vtCOM.begin(); it != m_vtCOM.end(); it++) {
 		if (!IsPortInserted(pCommbox1, it->c_str()))
 			pCommbox1->AddItem(it->c_str());
@@ -1162,6 +1167,19 @@ void CMainFrame::InitCombobox_port()
 		pCommboxUSB->SelectItem(szCom);
 	}
 
+	// 电源;
+	pCommboxPower->AddItem(_T("全部"));
+	pCommboxPower->AddItem(_T("Lan1"));
+	pCommboxPower->AddItem(_T("Lan2"));
+	pCommboxPower->AddItem(_T("Lan3"));
+	pCommboxPower->AddItem(_T("Lan4"));
+	pCommboxPower->AddItem(_T("Lan5"));
+	pCommboxPower->AddItem(_T("Lan6"));
+	// 设置高(避免有滚动条);
+	pCommboxPower->SetDropDownHeight(180);
+
+	pCommboxPower->SelectItem(Global::g_Config.nPowerLanIndex);
+
 }
 
 BOOL CMainFrame::IsPortInserted(CMFCRibbonComboBox* pCommbox, LPCTSTR lpPort)
@@ -1181,17 +1199,17 @@ BOOL CMainFrame::OnDeviceChange(UINT nEventType, DWORD_PTR dwData)
 	switch (nEventType)
 	{
 		// 串口拨掉;
-	case DBT_DEVICEREMOVECOMPLETE:
-		break;
-		// 串口插入;
-	case DBT_DEVICEARRIVAL:
-	{
-		Global::GetSysSerialPort(m_vtCOM);
-		InitCombobox_port();
-	}
-	break;
-	default:
-		break;
+		case DBT_DEVICEREMOVECOMPLETE:
+			break;
+			// 串口插入;
+		case DBT_DEVICEARRIVAL:
+		{
+			Global::GetSysSerialPort(m_vtCOM);
+			InitCombobox_port();
+			break;
+		}	
+		default:
+			break;
 	}
 	return TRUE;
 }
@@ -1773,7 +1791,6 @@ void CMainFrame::OnUpdateCheckEnabletw(CCmdUI* pCmdUI)
 
 void CMainFrame::OnComboTwport()
 {
-	// TODO: 在此添加命令处理程序代码
 	// TODO: 在此添加命令处理程序代码
 	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
 	ASSERT_VALID(pRibbon);
@@ -1902,3 +1919,93 @@ void CMainFrame::OnUpdateCheckUsb(CCmdUI* pCmdUI)
 	// TODO: 在此添加命令更新用户界面处理程序代码
 	pCmdUI->SetCheck(Global::g_Config.enableUSB);
 }
+
+// ***************** 闪盘切换 **************************
+void CMainFrame::OnSwitchUsb()
+{
+	// TODO: 在此添加命令处理程序代码
+	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonButton* pSwitchUSB = DYNAMIC_DOWNCAST(CMFCRibbonButton, pRibbon->FindByID(ID_SWITCH_USB));
+
+	CString strText = pSwitchUSB->GetText();
+	if (strText == _T("切PC"))
+	{
+		TW::SendSwitch(1);		// 切换到TV;
+		pSwitchUSB->SetText(_T("切TV"));
+	}
+	else
+	{
+		TW::SendSwitch(0);		// 切换到PC;
+		pSwitchUSB->SetText(_T("切PC"));
+	}
+}
+
+
+void CMainFrame::OnUpdateSwitchUsb(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+	pCmdUI->Enable(Global::g_Config.enableUSB);
+}
+
+// ***************** 电源控制 **************************
+void CMainFrame::OnComboPower()
+{
+	// TODO: 在此添加命令处理程序代码
+	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonComboBox* pCombobxPower = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, pRibbon->FindByID(ID_COMBO_POWER));
+
+	// 保存到配置文件中;
+	int nCurSel = pCombobxPower->GetCurSel();
+	if ( nCurSel != CB_ERR ) {
+		TCHAR szValue[30] = {0};
+		_itoa(nCurSel, szValue, 10);
+		WritePrivateProfileString(_T("PowerCtrl"), _T("LanIndex"), szValue, Global::g_szConfig);
+		Global::g_Config.nPowerLanIndex = nCurSel;
+	}
+}
+
+
+void CMainFrame::OnUpdateComboPower(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+	pCmdUI->Enable(Global::g_Config.enableTW);
+}
+
+
+void CMainFrame::OnPowerCtrl()
+{
+	// TODO: 在此添加命令处理程序代码
+	CMFCRibbonBar* pRibbon = g_pMainFrame->GetRibbonBar();
+	ASSERT_VALID(pRibbon);
+	CMFCRibbonButton* pPowerCtrl = DYNAMIC_DOWNCAST(CMFCRibbonButton, pRibbon->FindByID(ID_POWER_CTRL));
+
+	TCHAR szCommand[MAX_PATH] = {0};
+	CString strText = pPowerCtrl->GetText();
+	if (strText == _T("上电"))
+	{
+		_stprintf_s(szCommand, _T("*SET LAN %d POWER ON"), Global::g_Config.nPowerLanIndex);
+		if ( Global::g_Config.nPowerLanIndex == 0 )
+			TW::SendCmd(_T("*SET POWER ON"));
+		else 
+			TW::SendCmd(szCommand);
+		pPowerCtrl->SetText(_T("断电"));
+	}
+	else
+	{
+		_stprintf_s(szCommand, _T("*SET LAN %d POWER OFF"), Global::g_Config.nPowerLanIndex);
+		if (Global::g_Config.nPowerLanIndex == 0)
+			TW::SendCmd(_T("*SET POWER OFF"));
+		else
+			TW::SendCmd(szCommand);
+		pPowerCtrl->SetText(_T("上电"));
+	}
+}
+
+
+void CMainFrame::OnUpdatePowerCtrl(CCmdUI* pCmdUI)
+{
+	// TODO: 在此添加命令更新用户界面处理程序代码
+	pCmdUI->Enable(Global::g_Config.enableTW);
+}

+ 6 - 0
SATHelper/SATHelper/MainFrm.h

@@ -267,6 +267,12 @@ public:
 	afx_msg void OnUpdateComboUsb(CCmdUI* pCmdUI);
 	afx_msg void OnCheckUsb();
 	afx_msg void OnUpdateCheckUsb(CCmdUI* pCmdUI);
+	afx_msg void OnSwitchUsb();
+	afx_msg void OnUpdateSwitchUsb(CCmdUI* pCmdUI);
+	afx_msg void OnComboPower();
+	afx_msg void OnUpdateComboPower(CCmdUI* pCmdUI);
+	afx_msg void OnPowerCtrl();
+	afx_msg void OnUpdatePowerCtrl(CCmdUI* pCmdUI);
 };
 
 

+ 6 - 0
SATHelper/SATHelper/SATHelper.cpp

@@ -122,6 +122,11 @@ BOOL CSATHelperApp::InitInstance()
 	}
 #endif
 
+	InitPython();
+
+	// 示例;
+	//PyObject * pRet = CallPython("F:\\SAT\\SAT_API\\ssat_sdk\\device_manage\\testWizardClient.py", "API_UsbSwitch", 1, _variant_t(1));
+
 #if 1
 	GdiplusStartupInput gdiplusStartupInput;
 	GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
@@ -243,6 +248,7 @@ int CSATHelperApp::ExitInstance()
 	AfxOleTerm(FALSE);
 	Gdiplus::GdiplusShutdown(m_gdiplusToken);
 	g_iocp.Stop();
+	FreePython();
 	return CWinAppEx::ExitInstance();
 }
 

+ 6 - 2
SATHelper/SATHelper/SATHelper.vcxproj

@@ -99,11 +99,12 @@
       <SDLCheck>false</SDLCheck>
       <PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>..\UI;..\filehelper;..\cJson</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\UI;..\filehelper;..\cJson;C:\Python27\Include</AdditionalIncludeDirectories>
     </ClCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
       <AdditionalDependencies>QCAP.X86.lib;VFW32.LIB;legacy_stdio_definitions.lib</AdditionalDependencies>
+      <AdditionalLibraryDirectories>C:\Python27\libs;</AdditionalLibraryDirectories>
     </Link>
     <Midl>
       <MkTypLibCompatible>false</MkTypLibCompatible>
@@ -149,13 +150,14 @@
       <SDLCheck>false</SDLCheck>
       <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile>
-      <AdditionalIncludeDirectories>..\UI;..\filehelper;..\cJson</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>..\UI;..\filehelper;..\cJson;C:\Python27\Include</AdditionalIncludeDirectories>
     </ClCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
       <UACExecutionLevel>RequireAdministrator</UACExecutionLevel>
+      <AdditionalLibraryDirectories>C:\Python27\libs;</AdditionalLibraryDirectories>
     </Link>
     <Midl>
       <MkTypLibCompatible>false</MkTypLibCompatible>
@@ -208,6 +210,7 @@
     <ClInclude Include="..\UI\TreeComboBox.h" />
     <ClInclude Include="..\UI\XColorStatic.h" />
     <ClInclude Include="Base64.h" />
+    <ClInclude Include="CallPython.h" />
     <ClInclude Include="CaptureDef.h" />
     <ClInclude Include="CharEncoding.h" />
     <ClInclude Include="DevicesWnd.h" />
@@ -263,6 +266,7 @@
     <ClCompile Include="..\UI\TreeComboBox.cpp" />
     <ClCompile Include="..\UI\XColorStatic.cpp" />
     <ClCompile Include="Base64.cpp" />
+    <ClCompile Include="CallPython.cpp" />
     <ClCompile Include="CharEncoding.cpp" />
     <ClCompile Include="DevicesWnd.cpp" />
     <ClCompile Include="ChildFrm.cpp" />

+ 6 - 0
SATHelper/SATHelper/SATHelper.vcxproj.filters

@@ -198,6 +198,9 @@
     <ClInclude Include="SVNProc.h">
       <Filter>头文件</Filter>
     </ClInclude>
+    <ClInclude Include="CallPython.h">
+      <Filter>头文件</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="SATHelper.cpp">
@@ -320,6 +323,9 @@
     <ClCompile Include="SVNProc.cpp">
       <Filter>源文件</Filter>
     </ClCompile>
+    <ClCompile Include="CallPython.cpp">
+      <Filter>源文件</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="SATHelper.rc">

+ 81 - 80
SATHelper/SATHelper/SynSerial.cpp

@@ -7,7 +7,14 @@ CSynSerial::CSynSerial(void) :m_hSerialPort(NULL)
 {
 	memset(&m_dcb, 0, sizeof(DCB));
 	memset(&m_cts, 0, sizeof(COMMTIMEOUTS));
-	memset(&m_szSerialPort, 0, sizeof(TCHAR)*MAX_PORT_LEN);
+	memset(&m_szSerialPort, 0, sizeof(TCHAR) * MAX_PORT_LEN);
+
+	// 初始化重叠对象;
+	ZeroMemory(&m_wrOverlapped, sizeof(m_wrOverlapped));
+	if (m_wrOverlapped.hEvent != NULL) {
+		ResetEvent(m_wrOverlapped.hEvent);
+		m_wrOverlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+	}
 }
 
 CSynSerial::~CSynSerial(void)
@@ -15,15 +22,14 @@ CSynSerial::~CSynSerial(void)
 	CloseSerialPort();
 }
 
-BOOL CSynSerial::OpenSerialPort(IN CONST BYTE & byCommPort, IN CONST DWORD & dwBaudRate, IN CONST BYTE & bySize, IN CONST BYTE & byParity, IN CONST BYTE & byStopBits, IN CONST BYTE & byStartAddr, IN CONST INT & nInterval)
+BOOL CSynSerial::OpenSerialPort(IN CONST BYTE& byCommPort, IN CONST DWORD& dwBaudRate, IN CONST BYTE& bySize, IN CONST BYTE& byParity, IN CONST BYTE& byStopBits, IN CONST BYTE& byStartAddr, IN CONST INT& nInterval)
 {
 	ASSERT(byCommPort);
 	CloseSerialPort();
 
 	_stprintf_s(m_szSerialPort, _T("\\\\.\\com%d"), (int)byCommPort);
-	m_hSerialPort = CreateFile(m_szSerialPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, NULL, NULL);
-	if (m_hSerialPort == INVALID_HANDLE_VALUE)
-	{
+	m_hSerialPort = CreateFile(m_szSerialPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
+	if (m_hSerialPort == INVALID_HANDLE_VALUE) {
 		// 打开串口失败;
 		DWORD dwError = GetLastError();
 		return FALSE;
@@ -32,16 +38,18 @@ BOOL CSynSerial::OpenSerialPort(IN CONST BYTE & byCommPort, IN CONST DWORD & dwB
 	BOOL bResult = FALSE;
 	// SetupComm设置缓冲区大小;
 	bResult = SetupComm(m_hSerialPort, m_dwInQueue, m_dwOutQueue);
-	if (!bResult)
-	{
+	if (!bResult) {
+		CloseHandle(m_hSerialPort);
+		m_hSerialPort = INVALID_HANDLE_VALUE;
 		DWORD dwError = GetLastError();
 		return FALSE;
 	}
 
 	// 在串口读写之前,清除缓冲区;
 	bResult = PurgeComm(m_hSerialPort, PURGE_TXCLEAR | PURGE_RXCLEAR);
-	if (!bResult)
-	{
+	if (!bResult) {
+		CloseHandle(m_hSerialPort);
+		m_hSerialPort = INVALID_HANDLE_VALUE;
 		DWORD dwError = GetLastError();
 		return FALSE;
 	}
@@ -49,8 +57,9 @@ BOOL CSynSerial::OpenSerialPort(IN CONST BYTE & byCommPort, IN CONST DWORD & dwB
 	// GetCommState获取设备控制块状态;
 	memset(&m_dcb, 0, sizeof(DCB));
 	bResult = GetCommState(m_hSerialPort, &m_dcb);
-	if (!bResult)
-	{
+	if (!bResult) {
+		CloseHandle(m_hSerialPort);
+		m_hSerialPort = INVALID_HANDLE_VALUE;
 		DWORD dwError = GetLastError();
 		return FALSE;
 	}
@@ -70,16 +79,18 @@ BOOL CSynSerial::OpenSerialPort(IN CONST BYTE & byCommPort, IN CONST DWORD & dwB
 	// SetCommState设置设备的控制块状态;
 	memset(&m_cts, 0, sizeof(COMMTIMEOUTS));
 	bResult = SetCommState(m_hSerialPort, &m_dcb);
-	if (!bResult)
-	{
+	if (!bResult) {
+		CloseHandle(m_hSerialPort);
+		m_hSerialPort = INVALID_HANDLE_VALUE;
 		DWORD dwError = GetLastError();
 		return FALSE;
 	}
 
 	// 获取设备的超时值;
 	bResult = GetCommTimeouts(m_hSerialPort, &m_cts);
-	if (!bResult)
-	{
+	if (!bResult) {
+		CloseHandle(m_hSerialPort);
+		m_hSerialPort = INVALID_HANDLE_VALUE;
 		DWORD dwError = GetLastError();
 		return FALSE;
 	}
@@ -93,8 +104,9 @@ BOOL CSynSerial::OpenSerialPort(IN CONST BYTE & byCommPort, IN CONST DWORD & dwB
 
 	// 设置设备的超时值;
 	bResult = SetCommTimeouts(m_hSerialPort, &m_cts);
-	if (!bResult)
-	{
+	if (!bResult) {
+		CloseHandle(m_hSerialPort);
+		m_hSerialPort = INVALID_HANDLE_VALUE;
 		DWORD dwError = GetLastError();
 		return FALSE;
 	}
@@ -107,9 +119,8 @@ BOOL CSynSerial::ReOpenSerialPort()
 	ASSERT(_tcslen(m_szSerialPort));
 	CloseSerialPort();
 
-	m_hSerialPort = CreateFile(m_szSerialPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, NULL, NULL);
-	if (m_hSerialPort == INVALID_HANDLE_VALUE)
-	{
+	m_hSerialPort = CreateFile(m_szSerialPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
+	if (m_hSerialPort == INVALID_HANDLE_VALUE) {
 		// 打开串口失败;
 		DWORD dwError = GetLastError();
 		return FALSE;
@@ -118,16 +129,18 @@ BOOL CSynSerial::ReOpenSerialPort()
 	BOOL bResult = FALSE;
 	// SetupComm设置缓冲区大小;
 	bResult = SetupComm(m_hSerialPort, m_dwInQueue, m_dwOutQueue);
-	if (!bResult)
-	{
+	if (!bResult) {
+		CloseHandle(m_hSerialPort);
+		m_hSerialPort = INVALID_HANDLE_VALUE;
 		DWORD dwError = GetLastError();
 		return FALSE;
 	}
 
 	// 在串口读写之前,清除缓冲区;
 	bResult = PurgeComm(m_hSerialPort, PURGE_TXCLEAR | PURGE_RXCLEAR);
-	if (!bResult)
-	{
+	if (!bResult) {
+		CloseHandle(m_hSerialPort);
+		m_hSerialPort = INVALID_HANDLE_VALUE;
 		DWORD dwError = GetLastError();
 		return FALSE;
 	}
@@ -135,16 +148,18 @@ BOOL CSynSerial::ReOpenSerialPort()
 	// SetCommState设置设备的控制块状态;
 	memset(&m_cts, 0, sizeof(COMMTIMEOUTS));
 	bResult = SetCommState(m_hSerialPort, &m_dcb);
-	if (!bResult)
-	{
+	if (!bResult) {
+		CloseHandle(m_hSerialPort);
+		m_hSerialPort = INVALID_HANDLE_VALUE;
 		DWORD dwError = GetLastError();
 		return FALSE;
 	}
 
 	// 设置设备的超时值;
 	bResult = SetCommTimeouts(m_hSerialPort, &m_cts);
-	if (!bResult)
-	{
+	if (!bResult) {
+		CloseHandle(m_hSerialPort);
+		m_hSerialPort = INVALID_HANDLE_VALUE;
 		DWORD dwError = GetLastError();
 		return FALSE;
 	}
@@ -156,10 +171,10 @@ void CSynSerial::CloseSerialPort()
 {
 	if (m_hSerialPort != NULL && m_hSerialPort != INVALID_HANDLE_VALUE)
 		CloseHandle(m_hSerialPort);
-	m_hSerialPort = NULL;
+	m_hSerialPort = INVALID_HANDLE_VALUE;
 }
 
-BOOL CSynSerial::SetSerialPort(IN CONST DWORD & dwBaudRate, IN CONST BYTE & byByteSize, IN CONST BYTE & byParity, IN CONST BYTE & byStopBits, IN CONST BYTE & byStartAddr, IN CONST DWORD & dwInQueue, IN CONST DWORD & dwOutQueue)
+BOOL CSynSerial::SetSerialPort(IN CONST DWORD& dwBaudRate, IN CONST BYTE& byByteSize, IN CONST BYTE& byParity, IN CONST BYTE& byStopBits, IN CONST BYTE& byStartAddr, IN CONST DWORD& dwInQueue, IN CONST DWORD& dwOutQueue)
 {
 	if (!IsOpen())
 		return FALSE;
@@ -168,8 +183,7 @@ BOOL CSynSerial::SetSerialPort(IN CONST DWORD & dwBaudRate, IN CONST BYTE & byBy
 	// GetCommState获取设备控制块状态;
 	memset(&m_dcb, 0, sizeof(DCB));
 	bResult = GetCommState(m_hSerialPort, &m_dcb);
-	if (!bResult)
-	{
+	if (!bResult) {
 		DWORD dwError = GetLastError();
 		return FALSE;
 	}
@@ -189,16 +203,14 @@ BOOL CSynSerial::SetSerialPort(IN CONST DWORD & dwBaudRate, IN CONST BYTE & byBy
 	// SetCommState设置设备的控制块状态;
 	memset(&m_cts, 0, sizeof(COMMTIMEOUTS));
 	bResult = SetCommState(m_hSerialPort, &m_dcb);
-	if (!bResult)
-	{
+	if (!bResult) {
 		DWORD dwError = GetLastError();
 		return FALSE;
 	}
 
 	// 获取设备的超时值;
 	bResult = GetCommTimeouts(m_hSerialPort, &m_cts);
-	if (!bResult)
-	{
+	if (!bResult) {
 		DWORD dwError = GetLastError();
 		return FALSE;
 	}
@@ -212,8 +224,7 @@ BOOL CSynSerial::SetSerialPort(IN CONST DWORD & dwBaudRate, IN CONST BYTE & byBy
 
 	// 设置设备的超时值;
 	bResult = SetCommTimeouts(m_hSerialPort, &m_cts);
-	if (!bResult)
-	{
+	if (!bResult) {
 		DWORD dwError = GetLastError();
 		return FALSE;
 	}
@@ -221,15 +232,15 @@ BOOL CSynSerial::SetSerialPort(IN CONST DWORD & dwBaudRate, IN CONST BYTE & byBy
 	return TRUE;
 }
 
-void CSynSerial::SetSerialDCB(IN CONST DCB & dcb)
+void CSynSerial::SetSerialDCB(IN CONST DCB& dcb)
 {
 }
 
-void CSynSerial::SetSerialCommTimeouts(IN CONST COMMTIMEOUTS & commTimeouts)
+void CSynSerial::SetSerialCommTimeouts(IN CONST COMMTIMEOUTS& commTimeouts)
 {
 }
 
-DWORD CSynSerial::WriteComm(IN BYTE * pWirteBuf, IN CONST INT32 nWriteSize)
+DWORD CSynSerial::WriteComm(IN BYTE* pWirteBuf, IN CONST INT32 nWriteSize)
 {
 	if (!IsOpen())
 		return 0;
@@ -238,24 +249,35 @@ DWORD CSynSerial::WriteComm(IN BYTE * pWirteBuf, IN CONST INT32 nWriteSize)
 	{
 		return 0;
 	}
-	
+
 	DWORD dwErrorFlags;
 	DWORD dwBytesWritten = 0;	// 实际写入的字节数;
 	// 写前, 清除错误;
 	COMSTAT ComStat;
-	ClearCommError(m_hSerialPort, &dwErrorFlags, &ComStat);	
+	ClearCommError(m_hSerialPort, &dwErrorFlags, &ComStat);
 	// 写前,清空缓存区;
 	PurgeComm(m_hSerialPort, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
-	if ( !WriteFile(m_hSerialPort, pWirteBuf, nWriteSize, &dwBytesWritten, NULL) )
-	{
+	if (!WriteFile(m_hSerialPort, pWirteBuf, nWriteSize, &dwBytesWritten, &m_wrOverlapped)) {
 		DWORD dwError = GetLastError();
-	}	
+		if (ERROR_IO_PENDING == GetLastError()) {
+			while (!GetOverlappedResult(m_hSerialPort, &m_wrOverlapped, &dwBytesWritten, FALSE)) {
+				dwError = GetLastError();
+				if (ERROR_IO_PENDING == dwError || dwError == ERROR_IO_INCOMPLETE) {
+					continue;
+				}
+				else {
+					ClearCommError(m_hSerialPort, &dwError, NULL);
+					break;
+				}
+			}
+		}
+	}
 
 	// 返回写入字节数;
 	return dwBytesWritten;
 }
 
-DWORD CSynSerial::ReadComm(IN BYTE *pReadBuf, IN CONST DWORD& dwReadSize, WORD timeout /* = 300 */)
+DWORD CSynSerial::ReadComm(IN BYTE* pReadBuf, IN CONST DWORD& dwReadSize, WORD timeout /* = 300 */)
 {
 	if (!IsOpen())
 		return 0;
@@ -265,41 +287,20 @@ DWORD CSynSerial::ReadComm(IN BYTE *pReadBuf, IN CONST DWORD& dwReadSize, WORD t
 		return 0;
 	}
 
-	DWORD dwBytesRead = 0;
-	DWORD dwErrorFlags = 0;
-	// ReadFile前,使用ClearCommError清除错误;
-	COMSTAT ComStat = {0};
-	DWORD dwLastLen = 0;
-	ULONGLONG ulTick = GetTickCount64();	
-	// 直到有数据为止,超时3秒;
-	while (true)
-	{// cbInQue表示输入缓冲区的字节数; 
-		Sleep(timeout);
-		if (GetTickCount64() - ulTick > 3000)
-			break;
-		ClearCommError(m_hSerialPort, &dwErrorFlags, &ComStat);
-		// 防止读一次没读完,再读一次;二次长度一样表示读完;
-		if (ComStat.cbInQue != 0 && dwLastLen == ComStat.cbInQue)
-			break;
-		dwLastLen = ComStat.cbInQue;
-	}
-
-	if (ComStat.cbInQue == 0)
-	{
-		// 串口超时,无数据返回;
-		return 0;
+	DWORD dwError = 0;
+	DWORD dwRealRead;
+	if (!ClearCommError(m_hSerialPort, &dwError, NULL)) {
+		PurgeComm(m_hSerialPort, PURGE_TXABORT | PURGE_TXCLEAR);
 	}
 
-	dwBytesRead = ComStat.cbInQue;
-	if (dwReadSize < dwBytesRead)
-	{
-		dwBytesRead = dwReadSize;
-	}
-
-	if (ReadFile(m_hSerialPort, pReadBuf, dwBytesRead, &dwBytesRead, NULL))
-	{
-		return (INT)dwBytesRead;
+	if (!ReadFile(m_hSerialPort, pReadBuf, dwReadSize, &dwRealRead, &m_wrOverlapped)) {
+		if (GetLastError() == ERROR_IO_PENDING) {
+			while (!GetOverlappedResult(m_hSerialPort, &m_wrOverlapped, &dwRealRead, FALSE)) {
+				dwError = GetLastError();
+				printf("\t 码值=%d, 长度=%d, 内容=%s \n\n", dwError, dwRealRead, pReadBuf);
+			}
+		}
 	}
 
-	return dwBytesRead;
+	return dwRealRead;
 }

+ 1 - 1
SATHelper/SATHelper/SynSerial.h

@@ -33,7 +33,7 @@ private:
 	DCB		m_dcb;
 	HANDLE	m_hSerialPort;
 	COMMTIMEOUTS	m_cts;
-
+	OVERLAPPED		m_wrOverlapped;
 	// ´®¿ÚºÅ(1~255);
 	TCHAR	m_szSerialPort[MAX_PORT_LEN];
 	// ÊäÈ뻺´æ´óС(byte);

+ 87 - 58
SATHelper/SATHelper/res/ribbon.mfcribbon-ms

@@ -839,8 +839,12 @@
                                 <ELEMENT_NAME>Group</ELEMENT_NAME>
                                 <ELEMENTS>
                                     <ELEMENT>
-                                        <ELEMENT_NAME>Label</ELEMENT_NAME>
-                                        <TEXT>信号仪1:</TEXT>
+                                        <ELEMENT_NAME>Button_Check</ELEMENT_NAME>
+                                        <ID>
+                                            <NAME>ID_CHECK1_22293</NAME>
+                                            <VALUE>32807</VALUE>
+                                        </ID>
+                                        <TEXT>信号仪1</TEXT>
                                         <PALETTE_TOP>FALSE</PALETTE_TOP>
                                         <ALWAYS_LARGE>FALSE</ALWAYS_LARGE>
                                         <INDEX_SMALL>-1</INDEX_SMALL>
@@ -866,27 +870,18 @@
                                         <DROPDOWN_LIST>TRUE</DROPDOWN_LIST>
                                         <DROPDOWN_LIST_RESIZE>TRUE</DROPDOWN_LIST_RESIZE>
                                     </ELEMENT>
-                                    <ELEMENT>
-                                        <ELEMENT_NAME>Button_Check</ELEMENT_NAME>
-                                        <ID>
-                                            <NAME>ID_CHECK1_22293</NAME>
-                                            <VALUE>32807</VALUE>
-                                        </ID>
-                                        <TEXT>启动</TEXT>
-                                        <PALETTE_TOP>FALSE</PALETTE_TOP>
-                                        <ALWAYS_LARGE>FALSE</ALWAYS_LARGE>
-                                        <INDEX_SMALL>-1</INDEX_SMALL>
-                                        <INDEX_LARGE>-1</INDEX_LARGE>
-                                        <DEFAULT_COMMAND>TRUE</DEFAULT_COMMAND>
-                                    </ELEMENT>
                                 </ELEMENTS>
                             </ELEMENT>
                             <ELEMENT>
                                 <ELEMENT_NAME>Group</ELEMENT_NAME>
                                 <ELEMENTS>
                                     <ELEMENT>
-                                        <ELEMENT_NAME>Label</ELEMENT_NAME>
-                                        <TEXT>信号仪2:</TEXT>
+                                        <ELEMENT_NAME>Button_Check</ELEMENT_NAME>
+                                        <ID>
+                                            <NAME>ID_CHECK2_22293</NAME>
+                                            <VALUE>32804</VALUE>
+                                        </ID>
+                                        <TEXT>信号仪2</TEXT>
                                         <PALETTE_TOP>FALSE</PALETTE_TOP>
                                         <ALWAYS_LARGE>FALSE</ALWAYS_LARGE>
                                         <INDEX_SMALL>-1</INDEX_SMALL>
@@ -912,19 +907,6 @@
                                         <DROPDOWN_LIST>TRUE</DROPDOWN_LIST>
                                         <DROPDOWN_LIST_RESIZE>TRUE</DROPDOWN_LIST_RESIZE>
                                     </ELEMENT>
-                                    <ELEMENT>
-                                        <ELEMENT_NAME>Button_Check</ELEMENT_NAME>
-                                        <ID>
-                                            <NAME>ID_CHECK2_22293</NAME>
-                                            <VALUE>32804</VALUE>
-                                        </ID>
-                                        <TEXT>启动</TEXT>
-                                        <PALETTE_TOP>FALSE</PALETTE_TOP>
-                                        <ALWAYS_LARGE>FALSE</ALWAYS_LARGE>
-                                        <INDEX_SMALL>-1</INDEX_SMALL>
-                                        <INDEX_LARGE>-1</INDEX_LARGE>
-                                        <DEFAULT_COMMAND>TRUE</DEFAULT_COMMAND>
-                                    </ELEMENT>
                                 </ELEMENTS>
                             </ELEMENT>
                             <ELEMENT>
@@ -944,8 +926,12 @@
                                 <ELEMENT_NAME>Group</ELEMENT_NAME>
                                 <ELEMENTS>
                                     <ELEMENT>
-                                        <ELEMENT_NAME>Label</ELEMENT_NAME>
-                                        <TEXT>电视串口:</TEXT>
+                                        <ELEMENT_NAME>Button_Check</ELEMENT_NAME>
+                                        <ID>
+                                            <NAME>ID_CHECK_WATCHTV</NAME>
+                                            <VALUE>32809</VALUE>
+                                        </ID>
+                                        <TEXT>宕机监听</TEXT>
                                         <PALETTE_TOP>FALSE</PALETTE_TOP>
                                         <ALWAYS_LARGE>FALSE</ALWAYS_LARGE>
                                         <INDEX_SMALL>-1</INDEX_SMALL>
@@ -971,21 +957,69 @@
                                         <DROPDOWN_LIST>TRUE</DROPDOWN_LIST>
                                         <DROPDOWN_LIST_RESIZE>TRUE</DROPDOWN_LIST_RESIZE>
                                     </ELEMENT>
+                                </ELEMENTS>
+                            </ELEMENT>
+                             <ELEMENT>
+                                <ELEMENT_NAME>Group</ELEMENT_NAME>
+                                <ELEMENTS>
                                     <ELEMENT>
                                         <ELEMENT_NAME>Button_Check</ELEMENT_NAME>
                                         <ID>
-                                            <NAME>ID_CHECK_WATCHTV</NAME>
-                                            <VALUE>32809</VALUE>
+                                            <NAME>ID_CHECK_USB</NAME>
+                                            <VALUE>32826</VALUE>
                                         </ID>
-                                        <TEXT>TV宕机监听</TEXT>
+                                        <TEXT>闪盘切换</TEXT>
                                         <PALETTE_TOP>FALSE</PALETTE_TOP>
                                         <ALWAYS_LARGE>FALSE</ALWAYS_LARGE>
                                         <INDEX_SMALL>-1</INDEX_SMALL>
                                         <INDEX_LARGE>-1</INDEX_LARGE>
                                         <DEFAULT_COMMAND>TRUE</DEFAULT_COMMAND>
+                                    </ELEMENT>                                    
+                                    <ELEMENT>
+                                        <ELEMENT_NAME>ComboBox</ELEMENT_NAME>
+                                        <ID>
+                                            <NAME>ID_COMBO_USB</NAME>
+                                            <VALUE>32831</VALUE>
+                                        </ID>
+                                        <TEXT>U盘切换</TEXT>
+                                        <PALETTE_TOP>FALSE</PALETTE_TOP>
+                                        <ALWAYS_LARGE>FALSE</ALWAYS_LARGE>
+                                        <INDEX_SMALL>-1</INDEX_SMALL>
+                                        <INDEX_LARGE>-1</INDEX_LARGE>
+                                        <DEFAULT_COMMAND>TRUE</DEFAULT_COMMAND>
+                                        <WIDTH>50</WIDTH>
+                                        <WIDTH_FLOATY>0</WIDTH_FLOATY>
+                                        <SPIN_BUTTONS>FALSE</SPIN_BUTTONS>
+                                        <EDIT_BOX>FALSE</EDIT_BOX>
+                                        <DROPDOWN_LIST>TRUE</DROPDOWN_LIST>
+                                        <DROPDOWN_LIST_RESIZE>TRUE</DROPDOWN_LIST_RESIZE>
+                                    </ELEMENT>
+                                    <ELEMENT>
+                                        <ELEMENT_NAME>Button</ELEMENT_NAME>
+                                        <ID>
+                                            <NAME>ID_SWITCH_USB</NAME>
+                                            <VALUE>32832</VALUE>
+                                        </ID>
+                                        <TEXT>切PC</TEXT>
+                                        <KEYS>F</KEYS>
+                                        <PALETTE_TOP>FALSE</PALETTE_TOP>
+                                        <ALWAYS_LARGE>FALSE</ALWAYS_LARGE>
+                                        <INDEX_SMALL>5</INDEX_SMALL>
+                                        <INDEX_LARGE>0</INDEX_LARGE>
+                                        <DEFAULT_COMMAND>TRUE</DEFAULT_COMMAND>
+                                        <ALWAYS_DESCRIPTION>FALSE</ALWAYS_DESCRIPTION>
                                     </ELEMENT>
                                 </ELEMENTS>
                             </ELEMENT>
+                        </ELEMENTS>
+                    </PANEL>
+                    <PANEL>
+                        <ELEMENT_NAME>Panel</ELEMENT_NAME>
+                        <NAME>测试精灵</NAME>
+                        <INDEX>5</INDEX>
+                        <JUSTIFY_COLUMNS>TRUE</JUSTIFY_COLUMNS>
+                        <CENTER_COLUMN_VERT>TRUE</CENTER_COLUMN_VERT>
+                        <ELEMENTS>
                             <ELEMENT>
                                 <ELEMENT_NAME>Group</ELEMENT_NAME>
                                 <ELEMENTS>
@@ -1023,7 +1057,7 @@
                                             <NAME>ID_CHECK_ENABLETW</NAME>
                                             <VALUE>32810</VALUE>
                                         </ID>
-                                        <TEXT>启用精灵</TEXT>
+                                        <TEXT>启用</TEXT>
                                         <PALETTE_TOP>FALSE</PALETTE_TOP>
                                         <ALWAYS_LARGE>FALSE</ALWAYS_LARGE>
                                         <INDEX_SMALL>-1</INDEX_SMALL>
@@ -1032,21 +1066,13 @@
                                     </ELEMENT>
                                 </ELEMENTS>
                             </ELEMENT>
-                        </ELEMENTS>
-                    </PANEL>
-                    <PANEL>
-                        <ELEMENT_NAME>Panel</ELEMENT_NAME>
-                        <NAME>U盘切换</NAME>
-                        <INDEX>5</INDEX>
-                        <JUSTIFY_COLUMNS>TRUE</JUSTIFY_COLUMNS>
-                        <CENTER_COLUMN_VERT>TRUE</CENTER_COLUMN_VERT>
-                        <ELEMENTS>
+
                             <ELEMENT>
                                 <ELEMENT_NAME>Group</ELEMENT_NAME>
                                 <ELEMENTS>
                                     <ELEMENT>
                                         <ELEMENT_NAME>Label</ELEMENT_NAME>
-                                        <TEXT>U盘切换:</TEXT>
+                                        <TEXT>电源端口:</TEXT>
                                         <PALETTE_TOP>FALSE</PALETTE_TOP>
                                         <ALWAYS_LARGE>FALSE</ALWAYS_LARGE>
                                         <INDEX_SMALL>-1</INDEX_SMALL>
@@ -1056,37 +1082,40 @@
                                     <ELEMENT>
                                         <ELEMENT_NAME>ComboBox</ELEMENT_NAME>
                                         <ID>
-                                            <NAME>ID_COMBO_USB</NAME>
-                                            <VALUE>32831</VALUE>
+                                            <NAME>ID_COMBO_POWER</NAME>
+                                            <VALUE>32833</VALUE>
                                         </ID>
-                                        <TEXT>U盘切换</TEXT>
+                                        <TEXT>电源端口</TEXT>
                                         <PALETTE_TOP>FALSE</PALETTE_TOP>
                                         <ALWAYS_LARGE>FALSE</ALWAYS_LARGE>
                                         <INDEX_SMALL>-1</INDEX_SMALL>
                                         <INDEX_LARGE>-1</INDEX_LARGE>
                                         <DEFAULT_COMMAND>TRUE</DEFAULT_COMMAND>
-                                        <WIDTH>108</WIDTH>
-                                        <WIDTH_FLOATY>0</WIDTH_FLOATY>
+                                        <WIDTH>50</WIDTH>
+                                        <WIDTH_FLOATY>50</WIDTH_FLOATY>
                                         <SPIN_BUTTONS>FALSE</SPIN_BUTTONS>
-                                        <EDIT_BOX>TRUE</EDIT_BOX>
+                                        <EDIT_BOX>FALSE</EDIT_BOX>
                                         <DROPDOWN_LIST>TRUE</DROPDOWN_LIST>
                                         <DROPDOWN_LIST_RESIZE>TRUE</DROPDOWN_LIST_RESIZE>
                                     </ELEMENT>
                                     <ELEMENT>
-                                        <ELEMENT_NAME>Button_Check</ELEMENT_NAME>
+                                        <ELEMENT_NAME>Button</ELEMENT_NAME>
                                         <ID>
-                                            <NAME>ID_CHECK_USB</NAME>
-                                            <VALUE>32826</VALUE>
+                                            <NAME>ID_POWER_CTRL</NAME>
+                                            <VALUE>32834</VALUE>
                                         </ID>
-                                        <TEXT>启动</TEXT>
+                                        <TEXT>上电</TEXT>
+                                        <KEYS>F</KEYS>
                                         <PALETTE_TOP>FALSE</PALETTE_TOP>
                                         <ALWAYS_LARGE>FALSE</ALWAYS_LARGE>
-                                        <INDEX_SMALL>-1</INDEX_SMALL>
-                                        <INDEX_LARGE>-1</INDEX_LARGE>
+                                        <INDEX_SMALL>5</INDEX_SMALL>
+                                        <INDEX_LARGE>0</INDEX_LARGE>
                                         <DEFAULT_COMMAND>TRUE</DEFAULT_COMMAND>
+                                        <ALWAYS_DESCRIPTION>FALSE</ALWAYS_DESCRIPTION>
                                     </ELEMENT>
                                 </ELEMENTS>
                             </ELEMENT>
+
                         </ELEMENTS>
                     </PANEL>
                     <PANEL>

+ 5 - 2
SATHelper/SATHelper/resource.h

@@ -1,6 +1,6 @@
 //{{NO_DEPENDENCIES}}
-// Microsoft Visual C++ 生成的包含文件。
-// 供 SATHelper.rc 使用
+// Microsoft Visual C++ 锟斤拷锟缴的帮拷锟斤拷锟侥硷拷锟斤拷
+// 锟斤拷 SATHelper.rc 使锟斤拷
 //
 #define IDD_ABOUTBOX                    100
 #define IDP_OLE_INIT_FAILED             100
@@ -197,6 +197,9 @@
 #define ID_DEVICES_DEL                  32829
 #define ID_CHECK_ACTUATOR               32830
 #define ID_COMBO_USB                    32831
+#define ID_SWITCH_USB                   32832
+#define ID_COMBO_POWER                  32833
+#define ID_POWER_CTRL                   32834
 
 // Next default values for new objects
 // 

+ 2 - 0
SATHelper/SATHelper/stdafx.h

@@ -87,5 +87,7 @@ typedef struct __CAPTURE_INFO__
 
 #include "RedRatDLL.h"
 #include "TestWizardDLL.h"
+#include "CallPython.h"
+
 
 #endif //PCH_H