📄 ncapdlg.cpp
字号:
//随机数数据处理
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 + -