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

📄 usb_thermometerdlg.cpp

📁 USB温度采集系统的上位机程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		
		mSensorTotal=m_Total.GetCurSel()+1;//采集点数列表框的值+1=采集点数
		mRecvLength=2*mSensorTotal;//接收的数据长度
		mGetInput();
		mSentSample();

		while (1)			//定义一个动态接收采集数据的循环
		{
			MSG msg;
			while(PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);				
				if (bStop)
					return;// 跳出循环采集				
			}
			

			if( i==0 )
			{
				Sleep( 200 + ( ULONG ) ( pow(2,nBitChoice) * 100 ) );//通过测试选取最小休眠时间
				i=1;
			}//考虑到之前单片机准备上传的数据可能未被计算机取走,
				//导致首次回传有可能直接读到之前的数据而不是本次所需温度数据,所以首次上传先等待单片机准备好温度等数据
			
			mRecvLength=mSensorTotal*2;//设置接收长度


			if ( CH375ReadData( 0, mReadBuf, &mRecvLength ) )//一次上传所有采集点的温度值
			{		
				m_Describe.InsertString(-1,_T("上传数据成功"));
			}
			else
			{
				m_Describe.InsertString(-1,_T("上传数据失败"));
				return;
			}
									
			mRecvT();//接收温度值
			UpdateData(FALSE);
		
			switch(mSensorTotal)
			{
			case 8:	
				if (mTemperature[7]<mWarnL[7])
					MessageBox("采集点8:当前温度过低!","报警",MB_OK|MB_ICONEXCLAMATION);
				else if	(mTemperature[7]>mWarnH[7])
					MessageBox("采集点8:当前温度过高!","报警",MB_OK|MB_ICONEXCLAMATION);
			case 7:
				if (mTemperature[6]<mWarnL[6])
					MessageBox("采集点7:当前温度过低!","报警",MB_OK|MB_ICONEXCLAMATION);
				else if	(mTemperature[6]>mWarnH[6])
					MessageBox("采集点7:当前温度过高!","报警",MB_OK|MB_ICONEXCLAMATION);
			case 6:
				if (mTemperature[5]<mWarnL[5])
					MessageBox("采集点6:当前温度过低!","报警",MB_OK|MB_ICONEXCLAMATION);
				else if	(mTemperature[5]>mWarnH[5])
						MessageBox("采集点6:当前温度过高!","报警",MB_OK|MB_ICONEXCLAMATION);
			case 5:
				if (mTemperature[4]<mWarnL[4])
					MessageBox("采集点5:当前温度过低!","报警",MB_OK|MB_ICONEXCLAMATION);
				else if	(mTemperature[4]>mWarnH[4])
					MessageBox("采集点5:当前温度过高!","报警",MB_OK|MB_ICONEXCLAMATION);
			case 4:
				if (mTemperature[3]<mWarnL[3])
					MessageBox("采集点4:当前温度过低!","报警",MB_OK|MB_ICONEXCLAMATION);
				else if	(mTemperature[3]>mWarnH[3])
					MessageBox("采集点4:当前温度过高!","报警",MB_OK|MB_ICONEXCLAMATION);
			case 3:
				if (mTemperature[2]<mWarnL[2])
					MessageBox("采集点3:当前温度过低!","报警",MB_OK|MB_ICONEXCLAMATION);
				else if	(mTemperature[2]>mWarnH[2])
					MessageBox("采集点3:当前温度过高!","报警",MB_OK|MB_ICONEXCLAMATION);
			case 2:
				 if (mTemperature[1]<mWarnL[1])
					MessageBox("采集点2:当前温度过低!","报警",MB_OK|MB_ICONEXCLAMATION);
				else if	(mTemperature[1]>mWarnH[1])
					MessageBox("采集点2:当前温度过高!","报警",MB_OK|MB_ICONEXCLAMATION);
			case 1:
				if (mTemperature[0]<mWarnL[0])
					MessageBox("采集点1:当前温度过低!","报警",MB_OK|MB_ICONEXCLAMATION);
				else if	(mTemperature[0]>mWarnH[0])				
					MessageBox("采集点1:当前温度过高!","报警",MB_OK|MB_ICONEXCLAMATION);
			default: 
					break;
			}
			
			for(i=0;i<mSensorTotal;i++)          //判断是否有温度超标的采集点,如果有的话,退出采集函数Sample();
			{
				if( (mTemperature[i]<mWarnL[i])||(mTemperature[i]>mWarnH[i]) )
					return;
			}
			
		}
		
	}
			
}


void CUSB_ThermometerDlg::mSentTest()//发测试序列号数据准备函数
{	
	mWriteBuf[0]=START_TEST;//首字节为测试序列号命令码			
}


void CUSB_ThermometerDlg::mGetInput()//获取并存储用户输入的配置信息,为发送作准备
{

	mWarnL[0]=m_Warn_L1;//将温度下限控件与中间变量对应
	mWarnL[1]=m_Warn_L2;
	mWarnL[2]=m_Warn_L3;
	mWarnL[3]=m_Warn_L4;
	mWarnL[4]=m_Warn_L5;
	mWarnL[5]=m_Warn_L6;
	mWarnL[6]=m_Warn_L7;
	mWarnL[7]=m_Warn_L8;


	mWarnH[0]=m_Warn_H1;//将温度上限控件与中间变量对应
	mWarnH[1]=m_Warn_H2;
	mWarnH[2]=m_Warn_H3;
	mWarnH[3]=m_Warn_H4;
	mWarnH[4]=m_Warn_H5;
	mWarnH[5]=m_Warn_H6;
	mWarnH[6]=m_Warn_H7;
	mWarnH[7]=m_Warn_H8;


	mSensorNumInL[0]=m_SensorNumIn_L1;//将序列号控件与低双字中间变量对应
	mSensorNumInL[1]=m_SensorNumIn_L2;
	mSensorNumInL[2]=m_SensorNumIn_L3;
	mSensorNumInL[3]=m_SensorNumIn_L4;
	mSensorNumInL[4]=m_SensorNumIn_L5;
	mSensorNumInL[5]=m_SensorNumIn_L6;
	mSensorNumInL[6]=m_SensorNumIn_L7;
	mSensorNumInL[7]=m_SensorNumIn_L8;

	mSensorNumInH[0]=m_SensorNumIn_H1;//将序列号控件与高双字中间变量对应
	mSensorNumInH[1]=m_SensorNumIn_H2;
	mSensorNumInH[2]=m_SensorNumIn_H3;
	mSensorNumInH[3]=m_SensorNumIn_H4;
	mSensorNumInH[4]=m_SensorNumIn_H5;
	mSensorNumInH[5]=m_SensorNumIn_H6;
	mSensorNumInH[6]=m_SensorNumIn_H7;
	mSensorNumInH[7]=m_SensorNumIn_H8;

}




void CUSB_ThermometerDlg::mSentSample()//发采集温度数据准备函数
{
	int i=0,j=0;
	mWriteBuf[0]=mSensorTotal;//首字节为采集温度命令码,也是有传感器的采集点的个数			
	for(j=0;j<mSensorTotal;j++)
	{
		for(i=1;i<5;i++)
		{	
			mWriteBuf[i] = mSensorNumInL[j]>> ( 8*(i-1) );//序列号移位输出,强制数据转换
		}
		for(i=5;i<9;i++)
		{	
			mWriteBuf[i] = mSensorNumInH[j]>>(8*(i-5));//序列号移位输出,强制数据转换
		}
		
		mWriteBuf[i++]= (char)mWarnL[j];
		mWriteBuf[i++]= (char)mWarnH[j];
		mWriteBuf[i++]=mPrecisionChoice;//可以放到循环外面,因为每次都是发一样的数据
		if ( CH375WriteData( 0, mWriteBuf, &mSendLength ) )
		{	
			m_Describe.InsertString(-1,_T("下传数据成功"));
		}
		else
		{
			m_Describe.InsertString(-1,_T("下传数据失败"));
			return;//怎样返回OnSample()函数
		}	
	}
}




void CUSB_ThermometerDlg::mRecvSensorNum()//接收序列号处理函数
{
	int i;
	unsigned int mSensorNumOutL=0;//定义采得的序列号中间变量,防止和前一次获得的序列号相或
	unsigned int mSensorNumOutH=0;//定义采得的序列号中间变量
	for (i=0;i<4;i++)
	{
		mSensorNumOutL = mSensorNumOutL | ( (unsigned int)mReadBuf[i] << (8*i) ) ;
	}                             //低4位字节序列号的合并
	for (i=4;i<8;i++)	
	{
		mSensorNumOutH = mSensorNumOutH | ( (unsigned int)mReadBuf[i] << ( 8*(i-4) ) ) ;
	}	//高4位字节序列号的合并
	m_SensorNumOut_L=mSensorNumOutL;
	m_SensorNumOut_H=mSensorNumOutH;			
}


void CUSB_ThermometerDlg::mRecvT()//接收温度值处理函数
{
	int i=0,j=0;
	for(j=0;j<mSensorTotal;j++)
	{
		mTTemp[j]=(__int16 )mReadBuf[i++];
		mTTemp[j]|= ( (__int16) mReadBuf[i++] << 8 );//合并温度值高低两字节的内容为一个__int16型的数据
		nBitChoice=m_PrecisionBit.GetCurSel();
		mTemperature[j] = (mTTemp[j]  * 0.0625f);
	
	}
	//如何屏蔽掉那些没有传感器的采集点的温度显示?????
	m_Temperature1=mTemperature[0];
	m_Temperature2=mTemperature[1];
	m_Temperature3=mTemperature[2];
	m_Temperature4=mTemperature[3];
	m_Temperature5=mTemperature[4];
	m_Temperature6=mTemperature[5];
	m_Temperature7=mTemperature[6];
	m_Temperature8=mTemperature[7];

	switch(mSensorTotal)         //屏蔽没有DS18B20的采集点的温度显示
	{
	case 1:
		m_Temperature2=NULL;
	case 2:
		m_Temperature3=NULL;
	case 3:
		m_Temperature4=NULL;
	case 4:
		m_Temperature5=NULL;
	case 5:
		m_Temperature6=NULL;
	case 6:
		m_Temperature7=NULL;
	case 7:
		m_Temperature8=NULL;
	case 8:
		break;
	}

}



void CUSB_ThermometerDlg::OnCancel() 
{
	// TODO: Add extra cleanup here
	
	int nChoice= MessageBox("关闭设备和应用程序窗口!","提示消息",MB_OKCANCEL|MB_ICONEXCLAMATION); 
	switch(nChoice)  //关闭设备和应用程序窗口的确定与否选择
	{
	case IDOK:
		CH375CloseDevice( 0 );
		CDialog::OnCancel();
		break;
	case IDCANCEL:
		break;//选择CANCEL是否会回到被中断前程序正在执行的地方,而会中断保护???
	}
	
}



void CUSB_ThermometerDlg::OnTest() 
{
	// TODO: Add your control notification handler code here
	mSendLength=1;//一个字节命令码
	mRecvLength=8;//八个字节命令码

	if ( CH375OpenDevice( 0 ) == INVALID_HANDLE_VALUE )   // 使用之前必须打开设备 
	{
		m_Describe.InsertString(-1,_T("设备打开失败"));
		return;
	}
	else
	{
		m_Describe.InsertString(-1,_T("设备打开成功"));
		mSentTest();
		CH375SetTimeout( 0, 2000, 2000 );  
		if ( CH375WriteData( 0, mWriteBuf, &mSendLength ) )
		{	
			m_Describe.InsertString(-1,_T("下传数据成功"));
		}
		else
		{
			m_Describe.InsertString(-1,_T("下传数据失败"));
			return;
		}
		
		Sleep( 500 );//通过测试选取最小休眠时间
		//考虑到之前单片机准备上传的数据可能未被计算机取走,
		//导致回传有可能直接读到之前的数据而不是本次所需序列号,所以上传先等待单片机准备好序列号
				
		if ( CH375ReadData( 0, mReadBuf, &mRecvLength ) )
		{		
			m_Describe.InsertString(-1,_T("上传数据成功"));
		}
		else
		{
			m_Describe.InsertString(-1,_T("上传数据失败"));
			return;
		}
		mRecvSensorNum();//接收序列号成功则进行序列号处理
		UpdateData(false);//刷新序列号输出    
	}

		CH375CloseDevice( 0 );//如何清空CH375中的数据,和上位机缓存区中的数据,等待再次打开设备时存在的不是上次的数据???
	return;
}


void CUSB_ThermometerDlg::OnStop()    //停止温度采集,即显示停止前的温度值,关闭USB设备,但不关闭应用程序对话框
{
	// TODO: Add your control notification handler code here
	bStop=true;
	CH375CloseDevice( 0 );//如何清空CH375中的数据,和上位机缓存区中的数据,等待再次打开设备时存在的不是上次的数据???
	m_Describe.ResetContent(); 
	m_Describe.InsertString(-1,_T("设备已关闭"));
		
}

⌨️ 快捷键说明

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