📄 usb_thermometerdlg.cpp
字号:
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 + -