⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 selectbattdlg.cpp

📁 一个通过USB->UART读取C8051F060的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		ASSERT(pCalSpeed_ArgCmdToCom);
		ZeroMemory(pCalSpeed_ArgCmdToCom, sizeof(CalSpeed_ArgCmdToCom));
		
		//==1.向MCU发送命令部分===
		pCalSpeed_ArgCmdToCom->szCmdBuff[0] = 0x55;
		pCalSpeed_ArgCmdToCom->szCmdBuff[1] = 0x55;
		pCalSpeed_ArgCmdToCom->szCmdBuff[2] = 0x55;
		pCalSpeed_ArgCmdToCom->szCmdBuff[3] = 0x55;
		
		pCalSpeed_ArgCmdToCom->szCmdBuff[10] = 0x08;
		
		//转换成SOC内的字节顺序
		::memcpy(&pCalSpeed_ArgCmdToCom->szCmdBuff[4], &nActualSize, sizeof(int)*1);
		::SwapByte(&pCalSpeed_ArgCmdToCom->szCmdBuff[5], &pCalSpeed_ArgCmdToCom->szCmdBuff[6]);
		::SwapByte(&pCalSpeed_ArgCmdToCom->szCmdBuff[4], &pCalSpeed_ArgCmdToCom->szCmdBuff[7]);
		
		pCalSpeed_ArgCmdToCom->nActualLen   = 12;		
}




/////////////////////////////////////////////////////////////////////////////////////
static   BOOL    g_bReading   = FALSE;
static   BOOL    g_bImmdShowTip = FALSE;

/////////////////////////////////////////////////////////////////////////////////////
//以下三个变量专为停止通信线程使用
static   BOOL    g_bStopThread  = FALSE;
static   BOOL    g_bExitStopThread  = FALSE;
static   CCriticalSection   g_sStopSyncObj;
/////////////////////////////////////////////////////////////////////////////////////
//因为使用了安全线程对象,所以必须用线程
UINT   _fpStopThread(LPVOID pData)
{
		CSelectBattDlg *pThis = (CSelectBattDlg *)pData;
		if (pThis == NULL)
			return 1;

		g_bReading  = !g_bReading;
		pThis->m_btnConn.SetWindowText(g_bReading?"『停止读取』":"『连接读取』");
		if (!g_bReading)
		{
				g_objCalSerialComm.StopComm(TRUE);
				pThis->m_btnClose.EnableWindow(TRUE);
		}
		
		return 1;
}

UINT   _fpStartThread(LPVOID pData)
{
		CalSpeed_ArgCmdToCom *pArgObj = (CalSpeed_ArgCmdToCom *)pData;

		g_objCalSerialComm.SendUiCmd(pArgObj);		
		return 1;
}


#define  _HOPEBYTES  40
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
void CSelectBattDlg::OnConn() 
{
		//1.得到本次采集的总数据
		int    nHopeReadBytes = 0;		
		
		////////////////////////////////////////////////////////////////////////////////////////
		//
		g_bReading  = !g_bReading;
		m_btnConn.SetWindowText(g_bReading?"『停止读取』":"『连接读取』");
		if (!g_bReading)
		{
				g_objCalSerialComm.InitArv();
				g_objCalSerialComm.StopComm(TRUE);
				m_btnClose.EnableWindow(TRUE);
				return;
		}
		
		//2.查询文件是否存在?
		CFileFind    sFileFind;
		TRACE1("文件=%s.\n", g_pstrPath);
		if (sFileFind.FindFile((LPCTSTR)g_pstrPath) )
		{
				::AfxMessageBox("该电池型号的数据文件已存在,请重新输入!");
				return ;
		}

		////////////////////////////////////////////////////////////////////////////////////////////
		//3.确认后开始
		m_btnClose.EnableWindow(FALSE);
		if (::MessageBox(this->GetSafeHwnd(), _T("确定开始读取数据"), _T("读取采集器数据"), 
				MB_ICONEXCLAMATION|MB_YESNO) == IDNO)
		{		
				g_bReading = FALSE;
				m_btnConn.SetWindowText("『连接读取』");
				m_btnClose.EnableWindow(TRUE);
				return;
		}
		if (g_strBattPath.GetLength() <= 1)
		{
				g_bReading = FALSE;
				m_btnConn.SetWindowText("『连接读取』");
				m_btnClose.EnableWindow(TRUE);
				return ;
		}		
		
		///////////////////////////////////////////////////////////////////////////////////////////
		//4.期望读取数据
		int nExpectReadTime = this->GetRdTime();			//期望读取秒
		g_sGlobalArgInfo.fTotalTime = nExpectReadTime/1.0;	
		if (nExpectReadTime <= 0)							
		{
				g_bReading = FALSE;
				m_btnConn.SetWindowText("『连接读取』");
				m_btnClose.EnableWindow(TRUE);
				return ;
		}
		
		//5.启动线程开始通信
		g_objCalSerialComm.InitArv();
		g_objCalSerialComm.InitThread();
		g_objCalSerialComm.StartComm();	
		
		
		////////////////////////////////////////////////////////////////////////////////////////////
		//6.启动通讯
		g_sDataStream.InitFile(g_pstrPath/*文件名*/);//存储文件名
		CalSpeed_ArgCmdToCom    sArgObj;
		nHopeReadBytes = nExpectReadTime*_HOPEBYTES/*Ksps*/;	//计算出期望读取的字节数(KBytes)
		::TsfSendData(&sArgObj, nHopeReadBytes);				//读取 X 512 bytes
		
		g_objCalSerialComm.SendUiCmd(&sArgObj);
}

void CSelectBattDlg::OnClose() 
{
		g_objCalSerialComm.InitArv();
		g_objCalSerialComm.AcceptConsumer(NULL);	//取消通知界面
		g_objCalSerialComm.ClosePort();

		//关闭文件
		g_sDataStream.Cleanup();
		
		//退出界面
		this->EndDialog(1);
}

void   CSelectBattDlg::NotifyData (void *pData/*首地址*/, ULONG nSize/*大小*/)
{
		CDataReaderImpl::NotifyData(pData, nSize);
}

//
HRESULT CSelectBattDlg::OnRecvMsg(WPARAM wParam, LPARAM lParam)
{
		int  nCmdId = *(int *)wParam;

		switch (nCmdId)
		{
		case 0x01:	//退出通信
			{
					::AfxBeginThread(_fpStopThread, this, /*THREAD_PRIORITY_ABOVE_NORMAL*/THREAD_PRIORITY_HIGHEST);
			}
			break;
		case 0x02:	//显示接收数据
			{		
					float fVal= (*(float *)lParam)/1.0;
					this->SetRdTime(fVal);					
			}
			break;
		}

		return -1;
}



///////////////////////////////////////////////////////////////////////////////////////////////////
//清空闪存
UINT   _fpEraseFlashThread(LPVOID pData)
{
		LPCalSpeed_ArgCmdToCom pArgObj = (LPCalSpeed_ArgCmdToCom)pData;
		
		//准备擦存
		::EraseFlashBytes(pArgObj);
		g_objCalSerialComm.SendUiCmd(pArgObj);
		
		return 1;
}

static  CalSpeed_ArgCmdToCom    g_sEmptyFlashArgObj;
void CSelectBattDlg::OnEmptyFlash()
{
		if (::MessageBox(NULL, "确认清除采集器数据吗?", "操作警告", MB_ICONINFORMATION|MB_YESNO)== IDNO)
			return ;
		
		m_btnEmpty.SetWindowText("【正在清空】");
		m_btnEmpty.EnableWindow(FALSE);
		m_btnConn.EnableWindow(FALSE);
		this->SetTimer(1, 1000*20, NULL);
		
		::AfxBeginThread(_fpEraseFlashThread, &g_sEmptyFlashArgObj);
}

void CSelectBattDlg::OnTimer(UINT nIDEvent)
{
		m_btnEmpty.EnableWindow(TRUE);
		m_btnConn.EnableWindow(TRUE);
		m_btnEmpty.SetWindowText("【清空闪存】");
		this->KillTimer(1);
		
		//
		CDialog::OnTimer(nIDEvent);
}

#define BIF_USENEWUI 0x0050
#define BIF_EDITBO   0x080
void CSelectBattDlg::OnChgPath() 
{
	#ifdef _USEFILEDIALOG
			char pstrPath[APPPATHLEN];
			::pltCurrentPath(pstrPath, APPPATHLEN);

			static CFileDialog dlg(TRUE, NULL, NULL,
				OFN_HIDEREADONLY|BIF_RETURNONLYFSDIRS, _T("All Files (*.*)|*.*||"), this);
			
			// Set the directory where the file open dialog will start from.
			dlg.m_ofn.lpstrInitialDir = (LPCTSTR)pstrPath;

			// Set the title for the file open dialog.
			dlg.m_ofn.lpstrTitle = _T("电池数据存放目录");
			dlg.DoModal();
			CString  strFile = dlg.GetPathName();
	#else
			CString  strFile, m_Path;
			BROWSEINFO bi;
			char name[MAX_PATH];
			ZeroMemory(&bi,sizeof(BROWSEINFO));

			bi.hwndOwner      = GetSafeHwnd();
			bi.pszDisplayName = name;
			bi.lpszTitle =_T("电池数据存放目录");
			bi.ulFlags   = BIF_USENEWUI;
			LPITEMIDLIST pidl=SHBrowseForFolder(&bi);
			if(pidl == NULL)
				return;
	
			SHGetPathFromIDList(pidl, strFile.GetBuffer(MAX_PATH));
#if 1
			//获得分配算符
			IMalloc* pMalloc = NULL;
			HRESULT hr = SHGetMalloc(&pMalloc);
			if(FAILED(hr))
			{
					;
			}
			//释放pidl
			pMalloc->Free((void*)pidl);
			pidl = NULL;

			//清除分配符
			pMalloc->Release();
			pMalloc = NULL;
#endif
			strFile.ReleaseBuffer();
			m_Path=strFile;
			if(strFile.GetAt(strFile.GetLength()-1)!='\\')
				m_Path+="\\";
	#endif

		TRACE1("sd = %s.\n", m_Path);
		if (m_Path.GetLength() <= 0)
			return ;

		int  nIndex = m_Path.ReverseFind('\\');
		g_strBattPath = m_Path.Left(nIndex);		//当前路径
		if (g_strBattPath.GetLength() >= 0)
		{				
				::AfxGetApp()->WriteProfileString("数据目录", "默认路径", g_strBattPath);
				this->OnChangeBatttype();
		}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -