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

📄 ncapdlg.cpp

📁 功能非常强大的数据采集系统
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		//随机数数据处理
		if (theApp.a_iChannel==1)										//随机数数据处理
		{
			v_iX_number++;												//数据采集x计数
			v_fX = float(v_iX_number);									//x值
			v_fY = float(rand()/10000.0f);								//y值
			We_adddate(v_fX,v_fY,0);									//增加绘图数据
		}
		//串口数据处理:发送数据采集命令
		if (theApp.a_iChannel==2)										//串口数据处理
		{
			v_sTemp=0x01;												//起始
			v_sTemp+=0x05;												//命令长度(全部)
			v_sTemp+="1";												//命令:采集数据
			v_sTemp+=0x02;												//数据开始
			v_sTemp+=0x03;												//结束
			m_cComm.SetOutput(COleVariant(v_sTemp));					//串口发送
		}

		//自动状态处理
		if(v_bAuto_stop)												//自动停止采集?
		{
			if(v_iX_number>=v_iInput_number)							//达到采集点数
			{
				OnStart();												//停止采集
				if(v_bAuto_save)										//自动保存
					OnSaveMan();										//保存数据
			}
		}
		break;
	case 2:
		break;
	}
	
	CDialog::OnTimer(nIDEvent);
}

//-------------------------------------------------------------------------------------------------
// 串口通信:数据接收
//-------------------------------------------------------------------------------------------------
void CNcapDlg::OnMscomm() 
{
	// TODO: Add your control notification handler code here
	VARIANT			v_vInput1;
	COleSafeArray	v_vInput2;
	int				v_iLength;
	long			v_lVi;
	CString			v_sStr,v_sNnum,v_sNr;
	int				v_iEvent=m_cComm.GetCommEvent();

	switch(v_iEvent)
	{
	case 2:																//接收缓冲区内有字符
		v_vInput1=m_cComm.GetInput();									//读取缓冲区内的数据
		v_vInput2=v_vInput1;											//将VARIANT型变量转换为ColeSafeArray型变量
		v_iLength=v_vInput2.GetOneDimSize();							//确定数据长度
		for(v_lVi=0;v_lVi<v_iLength;v_lVi++)
		{
			v_vInput2.GetElement(&v_lVi,&v_bData[v_lVi]);				//将数据转换为BYTE型数组
			if (v_bData[v_lVi]==0x03)									//串口接收数据处理
				We_com_working();
		}
		break;
	case 4:
		break;
	}	
}

//-------------------------------------------------------------------------------------------------
// 功能:串口接收数据处理
//-------------------------------------------------------------------------------------------------
bool CNcapDlg::We_com_working()
{
	float		v_fX,v_fY;												//座标变量	
	v_iX_number++;														//数据采集x计数
	v_fX = float(v_iX_number);											//x值
	v_fY = float(v_bData[6]+v_bData[5]*256+v_bData[4]*65636);			//y值
	v_fY = float(v_fY/pow(2,24)*2.0484);								//24位数据换算

	switch(v_iX_number)
	{
		case 0:
			v_fY=0.12;
			break;
		case 1:
			v_fY=0.11498;
			break;
		case 2:
			v_fY=0.11044;
			break;
		case 3:
			v_fY=0.10642;
			break;
		case 4:
			v_fY=0.09806;
			break;
	}
	We_adddate(v_fX,v_fY,0);											//增加绘图数据
	return true;
}
	
//-------------------------------------------------------------------------------------------------
// 功    能:显示处理,增加一个数据
// 输入参数:v_fX x轴数据
//			 v_fY y轴数据		
//-------------------------------------------------------------------------------------------------
void CNcapDlg::We_adddate(float v_fX,float v_fY,int v_iIndex) 
{
	CString	v_sTemp;													//临时变量
	
	v_sTemp.Format("%d",v_iIndex);
	v_fY*=theApp.a_iMultiple;											//测量数据*放大倍数
	m_fData=v_fY;
	UpdateData(false);
	v_pCurveCtrl->AddData("Test_"+v_sTemp, v_fX, v_fY);					//增加图形数据
	if(v_iIndex==0)														//采集数据(非正弦信号)
		v_fData[v_iX_number]=v_fY;										//保存数据
	if (v_pCurveCtrl->m_fHoriEnd-v_iX_number<=1)						//采集点数接近图形边界
	{
		UpdateData(true);												//获得最新的移动、增加标志
		if (m_iMove==0)													//自动移动?
		{
			v_pCurveCtrl->m_fHoriBegin+=theApp.a_iNumber_move;			//自动左移theApp.a_iNumber_move点
			v_pCurveCtrl->m_fHoriEnd+=theApp.a_iNumber_move;			//自动左移theApp.a_iNumber_move点
		}
		else	
		{																//调整采集点数量	
			v_pCurveCtrl->m_fHoriEnd+=float(theApp.a_iNumber_append);	//一屏显示点数增加
			m_iPage+=theApp.a_iNumber_append;							//显示处理
			UpdateData(false);											//更新显示内容
		}
	}
	v_pCurveCtrl->Invalidate();											//图形显示
}


//-------------------------------------------------------------------------------------------------
// 功能:串口初始化
//-------------------------------------------------------------------------------------------------
void CNcapDlg::We_comm()
{
	CString		v_sTemp;												//临时变量

	switch(theApp.a_iBit)												//波特率
	{
	case 0:
		v_sTemp="4800";
		break;
	case 1:
		v_sTemp="9600";
		break;
	case 2:
		v_sTemp="19200";
		break;
	case 3:
		v_sTemp="38400";
		break;
	case 4:
		v_sTemp="57600";
		break;
	case 5:
		v_sTemp="115200";
		break;	
	}
	if( m_cComm.GetPortOpen())
		m_cComm.SetPortOpen(false);										//关闭串口
	m_cComm.SetSettings(v_sTemp+",n,8,1");								//速率设置
	m_cComm.SetCommPort(theApp.a_iCom+1);								//设置串口
	m_cComm.SetPortOpen(TRUE);											//打开串口
	m_cComm.SetDTREnable(TRUE);											//DTR有效
}

//-------------------------------------------------------------------------------------------------
// 读取初始化数据
//-------------------------------------------------------------------------------------------------
bool CNcapDlg::We_init()
{
	_RecordsetPtr v_pRecordset;											//数据库记录指针
	
	try
	{
		ADOConn v_cAdoConn;												// 数据库实例
		v_cAdoConn.OnInitADOConn(theApp.a_iDatabase_Type,theApp.a_sDatabase_Ip,theApp.a_sDatabase_Name,theApp.a_sDatabase_User,theApp.a_sDatabase_Password);
																		//连接数据库
		if (!v_cAdoConn.m_bFlag)
		{
			v_cAdoConn.ExitConnect();									//断开连接
			return false;
		}
		_bstr_t v_sSql="SELECT * FROM state";							//设置查询语句:state表
		v_pRecordset = v_cAdoConn.GetRecordSet(v_sSql);					//执行SELETE语句
		if (!v_cAdoConn.m_bFlag)
			return false;
		if(!v_pRecordset->adoEOF)
 		{
			if(v_pRecordset->Fields->GetItem("zdate")->ActualSize>0)	//读取 工作日期
				theApp.a_sDate=v_pRecordset->GetCollect("zdate").bstrVal;
			else theApp.a_sDate="";
			if(v_pRecordset->Fields->GetItem("znum")->ActualSize>0)		//读取 实验编号
				theApp.a_iNum = v_pRecordset->GetCollect("znum").iVal;
			else theApp.a_iNum = 1;
			if(v_pRecordset->Fields->GetItem("zds_time")->ActualSize>0)	//读取 时间间隔
				theApp.a_iDs_time = v_pRecordset->GetCollect("zds_time").iVal;
			else theApp.a_iDs_time = 0;
			if(v_pRecordset->Fields->GetItem("znumber")->ActualSize>0)	//读取 采样点数
				theApp.a_iNumber = v_pRecordset->GetCollect("znumber").iVal;
			else theApp.a_iNumber = 0;
			if(v_pRecordset->Fields->GetItem("zchannel")->ActualSize>0)	//读取 采样通道
				theApp.a_iChannel = v_pRecordset->GetCollect("zchannel").iVal;
			else theApp.a_iChannel = 0;
			if(v_pRecordset->Fields->GetItem("zauto_save")->ActualSize>0)
																		//自动保存标志
				theApp.a_bAuto_save = v_pRecordset->GetCollect("zauto_save").boolVal;
			else theApp.a_bAuto_save=false;
			if(v_pRecordset->Fields->GetItem("zauto_stop")->ActualSize>0)
																		//自动停止标志
				theApp.a_bAuto_stop = v_pRecordset->GetCollect("zauto_stop").boolVal;
			else theApp.a_bAuto_stop=false;
			if(v_pRecordset->Fields->GetItem("znumber_page")->ActualSize>0)	
																		//读取 一屏显示点数
				theApp.a_iNumber_page = v_pRecordset->GetCollect("znumber_page").iVal;
			else theApp.a_iNumber_page = 0;
			if(v_pRecordset->Fields->GetItem("znumber_move")->ActualSize>0)	
																		//读取 自动移动点数
				theApp.a_iNumber_move = v_pRecordset->GetCollect("znumber_move").iVal;
			else theApp.a_iNumber_move = 0;
			if(v_pRecordset->Fields->GetItem("znumber_append")->ActualSize>0)
																		//读取 自动增加点数
				theApp.a_iNumber_append = v_pRecordset->GetCollect("znumber_append").iVal;
			else theApp.a_iNumber_append = 0;
			if(v_pRecordset->Fields->GetItem("zauto_move")->ActualSize>0)
																		//自动移动标志
				theApp.a_iAuto_move = v_pRecordset->GetCollect("zauto_move").boolVal;
			else theApp.a_iAuto_move=0;
			if(v_pRecordset->Fields->GetItem("zip")->ActualSize>0)		//读取 网络ip
				theApp.a_sIp=v_pRecordset->GetCollect("zip").bstrVal;
			else theApp.a_sIp="";
			if(v_pRecordset->Fields->GetItem("zport")->ActualSize>0)	//读取 网络port
				theApp.a_iPort = v_pRecordset->GetCollect("zport").iVal;
			else theApp.a_iPort = 0;
			if(v_pRecordset->Fields->GetItem("zcom")->ActualSize>0)		//读取 串口端口
				theApp.a_iCom = v_pRecordset->GetCollect("zcom").iVal;
			else theApp.a_iCom = 0;
			if(v_pRecordset->Fields->GetItem("zcom_bit")->ActualSize>0)	//读取 串口速率
				theApp.a_iBit = v_pRecordset->GetCollect("zcom_bit").iVal;
			else theApp.a_iBit = 0;
			if(v_pRecordset->Fields->GetItem("zunit")->ActualSize>0)	//读取 实验物理量
				theApp.a_sUnit = v_pRecordset->GetCollect("zunit").bstrVal;
			else theApp.a_sUnit = "";
			if(v_pRecordset->Fields->GetItem("zname")->ActualSize>0)	//读取 实验名称
				theApp.a_sName = v_pRecordset->GetCollect("zname").bstrVal;
			else theApp.a_sName = "";
			if(v_pRecordset->Fields->GetItem("zmultiple")->ActualSize>0)	//读取 放大倍数
				theApp.a_iMultiple = v_pRecordset->GetCollect("zmultiple").iVal;
			else theApp.a_iMultiple = 1;
			if(v_pRecordset->Fields->GetItem("zmultiple")->ActualSize>0)	//读取 初始电位
				theApp.a_fVoltage = v_pRecordset->GetCollect("zvoltage").fltVal;
			else theApp.a_fVoltage = 0;

 		}
		v_cAdoConn.ExitConnect();										//断开连接
	}
	catch(_com_error e)													//捕捉异常
	{
		UpdateData(false);
		MessageBox("  数据库操作失败!  ","信息提示",MB_OK);
		return false;
	}
	UpdateData(false);
	return true;
}

//-------------------------------------------------------------------------------------------------
// 执行数据库命令
//-------------------------------------------------------------------------------------------------
bool CNcapDlg::We_save(CString v_sSql) 
{
	// TODO: Add your control notification handler code here
	bool v_bReturn=true;
	ADOConn v_cAdoConn;													// 数据库实例
	v_cAdoConn.OnInitADOConn(theApp.a_iDatabase_Type,theApp.a_sDatabase_Ip,theApp.a_sDatabase_Name,theApp.a_sDatabase_User,theApp.a_sDatabase_Password);
																		// 连接数据库
	if (!v_cAdoConn.ExecuteSQL((_bstr_t)v_sSql))						// 执行数据库操作
		v_bReturn=false;
	v_cAdoConn.ExitConnect();											//断开连接
	return v_bReturn;
}

//-------------------------------------------------------------------------------------------------
// 屏幕状态显示
//-------------------------------------------------------------------------------------------------
void CNcapDlg::We_status() 
{
	CString		v_sTemp,v_sTemp1;										//临时变量
	switch(theApp.a_iChannel)
	{
	case 0:
		v_sTemp="正弦信号";
		break;
	case 1:
		v_sTemp="随机数据";
		break;
	case 2:
		v_sTemp1.Format("%d",theApp.a_iCom+1);
		v_sTemp="串口端口:"+v_sTemp1+" ; 速率:";
		v_sTemp1=theApp.a_iBit==0?"4800":(theApp.a_iBit==1?"9600":(theApp.a_iBit==2?"19200":
		        (theApp.a_iBit==3?"38400":(theApp.a_iBit==4?"57600":"115200"))));
		v_sTemp+=v_sTemp1+" bit";
		We_comm();														//串口初始化
		break;
	case 3:
		break;
	case 4:
		break;
	}
	m_cStatus.SetWindowText(v_sTemp);
	m_iInput=theApp.a_iDs_time;											//采集时间
	v_iInput=m_iInput;
	m_iInput_number=theApp.a_iNumber;									//采集点数
	v_iInput_number=m_iInput_number;
	m_iMove=theApp.a_iAuto_move;										//移动、增加选择
	m_iPage=theApp.a_iNumber_page;										//一屏显示点数
	v_bAuto_save=theApp.a_bAuto_save;
	m_cSave.SetCheck(v_bAuto_save);										//自动保存标志
	v_bAuto_stop=theApp.a_bAuto_stop;
	m_cStop.SetCheck(v_bAuto_stop);										//自动停止标志
	m_sUnit=theApp.a_sUnit;												//实验物理量
	m_sName=theApp.a_sName;												//实验名称
	UpdateData(false);													//显示信息
}

//-------------------------------------------------------------------------------------------------
// 结束
//-------------------------------------------------------------------------------------------------

/*
(2)读取文件格式:其它格式,统一格式
(3)写入文件格式
(4)比较数据曲线:水平平移、垂直平移、部分数据删除
(5)截取部分图形分析处理
(6)左右移动限制: <0;  >上限
(7)文件路径
(8)指定位置放大
(9)采集时鼠标over无效

*/

BOOL CNcapDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
{
	// TODO: Add your message handler code here and/or call default
	v_pCurveCtrl->m_fHoriEnd+=10;
	ScreenToClient(&pt);
	return CDialog::OnMouseWheel(nFlags, zDelta, pt);
}

⌨️ 快捷键说明

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