atmeasuredoc.cpp
来自「串口应变采集系统」· C++ 代码 · 共 758 行 · 第 1/2 页
CPP
758 行
// AtmeasureDoc.cpp : implementation of the CAtmeasureDoc class
//
#include "stdafx.h"
#include "Atmeasure.h"
#include "AtmeasureSet.h"
#include "AtmeasureDoc.h"
#include "PortDialog.h"
#include "AtmeasureView.h"
#include "SysDialog.h"
#include "Point.h"
#include "SysSet.h"
#include "PortSet.h"
#include "PointSet.h"
#include "PhSet.h"
#include "CyTime.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAtmeasureDoc
IMPLEMENT_DYNCREATE(CAtmeasureDoc, CDocument)
BEGIN_MESSAGE_MAP(CAtmeasureDoc, CDocument)
//{{AFX_MSG_MAP(CAtmeasureDoc)
ON_COMMAND(ID_PORT_SET, OnPortSet)
ON_COMMAND(ID_SYS_CHANNEL, OnSysChannel)
ON_COMMAND(ID_BALANCE, OnBalance)
ON_COMMAND(ID_qkbanlance, Onqkbanlance)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAtmeasureDoc construction/destruction
CAtmeasureDoc::CAtmeasureDoc()
{
// TODO: add one-time construction code here
//----this sentence must be commentted out after debug !!!!!!!!!!!!!!!!!!!!11
m_database.Open("dbat" );
// m_TestDB.Open("dbpos");
// m_id=0;
//----------------------------------
//COM port
// CtrlPort = "COM1";
// DataPort = "COM3";
//sample frequency
// SamNormHZ=35;
//data buffer
sndNum = 0;
sndTempNum=0;
PHflag=0;
// ChannelNum=4;
m_strSendRequire = _T("0000 0003 0000 002C 0000 0000 0000 0001 0000 0001 0000 0000 0000 0064 0000 0000 FFFF FF9A 0000 0000 FFFF FBD3");
String2Hex(m_strSendRequire,m_SendRequireHEX);
DataWithHeadLen = 0;
for(int i=0;i<64;i++)
DataInWithHead[i] = 0;
datacont = 0;
ctrlcont = 0;
// times=0;
// for(i=0;i<15;i++)
// bochang.buffer[i]=0;
/* for(i=0;i<5;i++)
{
PointNum[i]=15;
}*/
for(i=0;i<49;i++)
{
wave[i]=0;
wavesum[i]=0;
for(int j=0;j<29;j++)
{
wavetemp[j][i]=0;
}
}
}
CAtmeasureDoc::~CAtmeasureDoc()
{
//----this sentence must be commentted out after debug !!!!!!!!!!!!!!!!!!!!11
// m_TestDB.Close();
m_database.Close();
}
BOOL CAtmeasureDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CAtmeasureDoc serialization
void CAtmeasureDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CAtmeasureDoc diagnostics
#ifdef _DEBUG
void CAtmeasureDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CAtmeasureDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CAtmeasureDoc commands
/////////////////////端口设置////////////////////////
void CAtmeasureDoc::OnPortSet()
{
// TODO: Add your command handler code here
CPortDialog dlg;
CString datatemp,ctrltemp;
///////////////////////////////
CPortSet *ws;
ws=new CPortSet;
ws->Open();
dlg.m_strCtrl=ws->m_strctrl;
dlg.m_strData=ws->m_strdata;
dlg.m_cyedit=ws->m_cyfreq;
dlg.m_ccedit=ws->m_ccfreq;
dlg.m_gbjedit=ws->m_gbj;
dlg.m_dbjedit=ws->m_dbj;
dlg.m_gyjedit=ws->m_gyj;
dlg.m_dyjedit=ws->m_dyj;
ws->Close();
///////////////////////////
dlg.m_strData = DataPort;
dlg.m_strCtrl = CtrlPort;
begin:
datatemp = DataPort;
ctrltemp = CtrlPort;
if(dlg.DoModal()==IDOK)
{
//data port setting
DataPort = dlg.m_strData;
//ctrl port setting
CtrlPort = dlg.m_strCtrl;
//check the two setting
if((DataPort.CompareNoCase("COM1")&&DataPort.CompareNoCase("COM2")&&DataPort.CompareNoCase("COM3")&&
DataPort.CompareNoCase("COM4")&&DataPort.CompareNoCase("COM5")&&DataPort.CompareNoCase("COM6")))
{
DataPort = datatemp;
AfxMessageBox("error setting");
goto begin;
}
if((CtrlPort.CompareNoCase("COM1")&&CtrlPort.CompareNoCase("COM2")&&CtrlPort.CompareNoCase("COM3")&&
CtrlPort.CompareNoCase("COM4")&&CtrlPort.CompareNoCase("COM5")&&CtrlPort.CompareNoCase("COM6")))
{
CtrlPort = ctrltemp;
MessageBox(NULL,"端口设置错误","错误",MB_ICONERROR);
goto begin;
}
//two channel can not use one COM
if(!DataPort.CompareNoCase(CtrlPort))
{
DataPort = datatemp;
CtrlPort = ctrltemp;
MessageBox(NULL,"端口冲突","错误",MB_ICONERROR);
goto begin;
}
}
}
/////////////////////////给51及OCM发送指令/////////////////////////
void CAtmeasureDoc::SendTo51()
{
CString sendStr;
sndTempNum = sndTempNum%ChannelNum;
sndNum = sndTempNum;
sendStr.Format("AT%d",sndNum);
if(DataCOMClosed == false)
m_CtrlCOM.SetOutput(COleVariant(sendStr));
Sleep(40);
sndTempNum++;
}
int CAtmeasureDoc::String2Hex(CString str, CByteArray &senddata)
{
int hexdata,lowhexdata;
int hexdatalen=0;
int len=str.GetLength();
senddata.SetSize(len/2);
for(int i=0;i<len;)
{
char lstr,hstr=str[i];
if(hstr==' ')
{
i++;
continue;
}
i++;
if(i>=len)
break;
lstr=str[i];
hexdata=ConvertHexChar(hstr);
lowhexdata=ConvertHexChar(lstr);
if((hexdata==16)||(lowhexdata==16))
break;
else
hexdata=hexdata*16+lowhexdata;
i++;
senddata[hexdatalen]=(char)hexdata;
hexdatalen++;
}
senddata.SetSize(hexdatalen);
return hexdatalen;
}
char CAtmeasureDoc::ConvertHexChar(char ch)
{
if((ch>='0')&&(ch<='9'))
return ch-0x30;
else if((ch>='A')&&(ch<='F'))
return ch-'A'+10;
else if((ch>='a')&&(ch<='f'))
return ch-'a'+10;
else return (-1);
}
//////////////////////从OCM中取数///////////////////////////
void CAtmeasureDoc::GetData()
{
VARIANT variant;
COleSafeArray safearray;
long len=0;
BYTE tempDataIn[256];
variant = m_DataCOM.GetInput();
safearray = variant;
len = safearray.GetOneDimSize();
DataWithHeadLen = len/4;
//////////////////convert data into byte type/////////////////////
for(long k=0;k<len;k++)
safearray.GetElement(&k,tempDataIn+k);
////////////////convert data into dword type/////////////////////
for(k=0;k<len;k=k+4)
{
DataInWithHead[k/4] = tempDataIn[k];
DataInWithHead[k/4] = DataInWithHead[k/4]<<8;
DataInWithHead[k/4] += tempDataIn[k+1];
DataInWithHead[k/4] = DataInWithHead[k/4]<<8;
DataInWithHead[k/4] += tempDataIn[k+2];
DataInWithHead[k/4] = DataInWithHead[k/4]<<8;
DataInWithHead[k/4] += tempDataIn[k+3];
}
}
DWORD CAtmeasureDoc::CheckSum(DWORD array[], int start, int end)
{
DWORD sum=0,temp;
BYTE ttemp;
for(int i=start;i<end;i++)
{
temp=array[i];
for(int j=0;j<=3;j++)
{
ttemp=temp&0xff;
sum+=ttemp;
temp=temp>>8;
}
}
sum=~sum;
return(sum);
}
bool CAtmeasureDoc::CheckData()
{
DWORD datasum = CheckSum(DataInWithHead ,4 ,DataWithHeadLen-3);
DWORD allsum = CheckSum(DataInWithHead ,0 ,DataWithHeadLen-1);
if((DataInWithHead[0]!=0x00000003)||
(DataInWithHead[DataWithHeadLen-3]!=datasum)||
(DataInWithHead[DataWithHeadLen-1]!=allsum))
{
// AfxMessageBox("校验和错误");
return false;
}
return true;
}
int CAtmeasureDoc::GetWaveLen()
{
// this->Pointpos(61);
CAtmeasureView* pView;
CFrameWnd * pFrame = (CFrameWnd *)(AfxGetApp()->m_pMainWnd);
pView = (CAtmeasureView*)pFrame->GetActiveView();
int pointnum=PointNum[sndNum];
int peaknum = 0;
long double temp;
peaknum = DataInWithHead[7];
if(peaknum != pointnum)
return 1;
if(datacont<10)
{
for(int i=0;i<peaknum;i++)
{
temp = ((double)(DataInWithHead[8+i]&0x0000ffff))/1000+180;
// bochang.buffer[i] = (299792.458/temp);
wavetemp[datacont][i]=(299792.458/temp);
}
}
else
{
for(int i=0;i<peaknum;i++)
{
double iTemp;
for(int j=1;j<10;j++)
{
for(int k=10-1;k>=j;k--)
{
if(wavetemp[k][i]<wavetemp[k-1][i])
{
iTemp = wavetemp[k-1][i];
wavetemp[k-1][i] =wavetemp[k][i];
wavetemp[k][i] = iTemp;
}
}
}
}
for(int m=0;m<peaknum;m++)
for(int n=2;n<8;n++)
{
wavesum[m]+=wavetemp[n][m];
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?