?? testdlg.cpp
字號:
// testDlg.cpp : implementation file
//
#include "stdafx.h"
#include "test.h"
#include "testDlg.h"
#include "math.h"
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTestDlg dialog
CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTestDlg)
m_js = 0;
m_strx = _T("");
m_stry = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTestDlg)
DDX_Text(pDX, IDC_EDIT1, m_js);
DDX_Text(pDX, IDC_EDIT2, m_strx);
DDX_Text(pDX, IDC_EDIT3, m_stry);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
//{{AFX_MSG_MAP(CTestDlg)
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTestDlg message handlers
BOOL CTestDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CenterWindow(GetDesktopWindow()); // center to the hpc screen
aFile=CreateFile(_T("\\My Documents\\test\\data.txt"),GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
CRect rect;
rect.left = 0;
rect.top = 0;
rect.right = 248;
rect.bottom = 180;
//創建曲線控件實例
m_2DGraph.m_crBackColor = RGB(118,146,131); //控件背景色
m_2DGraph.m_crGridColor = RGB(56,104,169); //邊框顏色
m_2DGraph.m_crTextColor = RGB(122,122,122); //字體顏色
m_2DGraph.Create(_T(""),_T(""),WS_VISIBLE | WS_CHILD, rect, this,0,NULL) ;
flag1=1;
flag2=0;
fs=256;
fcx=26;
fcy=20;
return TRUE; // return TRUE unless you set the focus to a control
}
void CTestDlg::OpenCom()
{
DWORD dwError;
DCB dcb;
COMMTIMEOUTS TimeOuts;
hCom=CreateFile(_T("COM7:"),GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
if(hCom==INVALID_HANDLE_VALUE)
{dwError=GetLastError();}
SetupComm(hCom,7,7);
TimeOuts.ReadIntervalTimeout=1000;
TimeOuts.ReadTotalTimeoutMultiplier=500;
TimeOuts.ReadTotalTimeoutConstant=5000;
TimeOuts.WriteTotalTimeoutMultiplier=500;
TimeOuts.WriteTotalTimeoutConstant=5000;
SetCommTimeouts(hCom,&TimeOuts);
GetCommState(hCom,&dcb);
dcb.BaudRate=57600;
dcb.ByteSize=8;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
SetCommState(hCom,&dcb);
}
DWORD CTestDlg::ReadThreadFunc(PVOID pArg)
{
char buf[5],bufx[5],bufy[5];
int i,j=0,k=0,nx=0,ny=0,m;
int js=0;
char fh1[1]={0};
char fh2[2]={0};
DWORD b,a;
double x[512],y[512];
BYTE *readBuf=NULL ; //讀取的字節
DWORD actualReadLen=0; //實際讀取的字節數
CEdit *pedit;
pedit=(CEdit *)pArg;
CTestDlg *pDlg;
pDlg=(CTestDlg *)AfxGetMainWnd();
for(m=0;m<512;m++)
{
x[m]=0;
y[m]=0;
}
for(m=0;m<5;m++)
{
bufx[m]='0';
bufy[m]='0';
buf[m]='0';
}
pDlg->OpenCom();
fh1[0]=' ';
fh2[0]=0x0D;
fh2[1]=0x0A;
// 清空緩沖,并檢查串口是否打開。
ASSERT(pDlg->hComm !=INVALID_HANDLE_VALUE);
//清空串口
PurgeComm(pDlg->hCom, PURGE_RXCLEAR | PURGE_TXCLEAR );
//尋找數據的起始位置
while(TRUE)
{
readBuf = new BYTE[1];
ReadFile(pDlg->hCom, readBuf, 1, &actualReadLen,0);
if(*readBuf==0x0D)
break;
}
//讀數
i=0;
while (TRUE)
{
readBuf = new BYTE[1];
ReadFile(pDlg->hCom, readBuf, 1, &actualReadLen,0);
if(*readBuf>='0'&&*readBuf<='9')
{
buf[i]=*readBuf;
i++;
}
if(*readBuf==',')
{
for(j=5-i,m=0;j<5;j++,m++)
bufx[j]=buf[m];
x[nx]=atoi(bufx);
nx++;
SetFilePointer(pDlg->aFile,0,NULL,FILE_END);
WriteFile(pDlg->aFile,bufx,5,&a,NULL);
SetFilePointer(pDlg->aFile,0,NULL,FILE_END);
WriteFile(pDlg->aFile,fh1,1,&a,NULL);
i=0;
for(m=0;m<5;m++)
bufx[m]='0';
}
if(*readBuf==0x0D)
{
for(j=5-i,m=0;j<5;j++,m++)
bufy[j]=buf[m];
y[ny]=atoi(bufy);
ny++;
SetFilePointer(pDlg->aFile,0,NULL,FILE_END);
WriteFile(pDlg->aFile,bufy,5,&b,NULL);
SetFilePointer(pDlg->aFile,0,NULL,FILE_END);
WriteFile(pDlg->aFile,fh2,2,&b,NULL);
for(m=0;m<5;m++)
bufy[m]='0';
i=0;
js++;
}
if(js%128==0)
{
pDlg->UpdateData(TRUE);
pDlg->m_js=js;
pDlg->UpdateData(FALSE);
}
//處理數據
if(js==512)
{
nx=ny=0;
js=0;
pDlg->chuli(x,y);
}
//如果收到讀線程退出信號,則退出線程
if (WaitForSingleObject(pDlg->m_hReadCloseEvent,500) == WAIT_OBJECT_0)
{
break;
}
}
return 0;
}
void CTestDlg::OnButton1()
{
DWORD ThreadID;
CEdit *pedit1;
pedit1=(CEdit *)GetDlgItem(IDC_EDIT1);
m_hReadThread=CreateThread(NULL,0,ReadThreadFunc,pedit1,0,&ThreadID);
}
void CTestDlg::OnButton2()
{
SetEvent(m_hReadCloseEvent);
//設置所有事件無效無效
SetCommMask(hCom, 0);
//清空所有將要讀的數據
PurgeComm( hCom, PURGE_RXCLEAR );
//等待1秒,如果讀線程沒有退出,則強制退出
if (WaitForSingleObject(m_hReadThread,1000) == WAIT_TIMEOUT)
{
TerminateThread(m_hReadThread,0);
}
m_hReadThread = NULL;
CloseHandle(hCom);
CDialog::OnOK();
CloseHandle(aFile);
CloseHandle(bFile);
}
void CTestDlg::chuli(double x[],double y[])
{
int i;
DWORD a,b,c,d;
DWORD FileSize;
CString sx,sy;
double fy1[512],fy2[512],sumx=0,sumy=0;
double x1,x2,y1,y2;
double wls,wvs;
double ccx[512],ccy[512],cc1x[512],cc1y[512],cc2x[512],cc2y[512],cc3x[512],cc3y[512],cc4x[512],cc4y[512],cc5x[512],cc5y[512],cc6x[512],cc6y[512],cc7x[512],cc7y[512],cc8x[512],cc8y[512],cc9x[512],cc9y[512],cc10x[512],cc10y[512];
char stime[22]={0},strx[7]={0},stry[7]={0};
FILETIME filetime,localtime;
SYSTEMTIME st;
char *fh="\r\n";
char bt[]=" 測量時間 x y";
//數據轉換,變為工程單位
for(i=0;i<fs*2;i++)
{
x[i]=(x[i]-8249.5)*2/5453;
sumx+=x[i];
y[i]=(y[i]-8220.5)*2/5489;
sumy+=y[i];
}
x1=sumx/(fs*2);
y1=sumy/(fs*2);
sumx=0;
sumy=0;
for(i=0;i<fs*2;i++)
{
x[i]=x[i]-x1;
if(fabs(x[i])>0.2)
x[i]=0;
sumx+=x[i];
y[i]=y[i]-y1;
if(fabs(y[i])>0.2)
y[i]=0;
sumy+=y[i];
}
// zuotu(x);
x2=sumx/(fs*2);
y2=sumy/(fs*2);
sumx=0;
sumy=0;
for(i=0;i<fs*2;i++)
{
x[i]=x[i]-x2;
y[i]=y[i]-y2;
}
//頻譜分析
rfft(x,fy1,fs*2);
rfft(y,fy2,fs*2);
//構造加權系數
freq[0]=0.5;
for(i=1;i<fs;i++)
{
freq[i]=freq[i-1]+0.5;
}
for(i=0;i<10;i++)
{
ffx[i]=0.8*pow(freq[i],2);
}
for(i=10;i<52;i++)
{
ffx[i]=650/pow(freq[i],2);
}
for(i=52;i<fs;i++)
{
ffx[i]=1;
}
for(i=97;i<102;i++)
{
ffx[i]=0;
ffy[i]=0;
}
for(i=0;i<11;i++)
{
ffy[i]=0.325*pow(freq[i],2);
}
for(i=11;i<40;i++)
{
ffy[i]=400/pow(freq[i],2);
}
for(i=40;i<fs;i++)
{
ffy[i]=1;
}
//分條件計算平穩性指標
switch(flag1)
{
case 1:
{
for(i=0;i<fs*2;i++)
{
cc1x[i]=sqrt(pow(x[i],2)+pow(fy1[i],2))/fs;
cc1y[i]=sqrt(pow(y[i],2)+pow(fy2[i],2))/fs;
}
if(flag2==0)
{
for(i=0;i<=fcx/0.5;i++)
sumx+=pow(cc1x[i+1],3)*ffx[i]/freq[i];
for(i=0;i<=fcy/0.5;i++)
sumy+=pow(cc1y[i+1],3)*ffy[i]/freq[i];
wls=7.08*pow(sumx,0.1);
wvs=7.08*pow(sumy,0.1);
}
flag1++;
sumx=sumy=0;
break;
}
case 2:
{
for(i=0;i<fs*2;i++)
{
cc2x[i]=sqrt(pow(x[i],2)+pow(fy1[i],2))/fs;
cc2y[i]=sqrt(pow(y[i],2)+pow(fy2[i],2))/fs;
}
if(flag2==0)
{
for(i=0;i<=fcx/0.5;i++)
sumx+=pow(cc2x[i+1],3)*ffx[i]/freq[i];
for(i=0;i<=fcy/0.5;i++)
sumy+=pow(cc2y[i+1],3)*ffy[i]/freq[i];
wls=7.08*pow(sumx,0.1);
wvs=7.08*pow(sumy,0.1);
}
flag1++;
sumx=sumy=0;
break;
}
case 3:
{
for(i=0;i<fs*2;i++)
{
cc3x[i]=sqrt(pow(x[i],2)+pow(fy1[i],2))/fs;
cc3y[i]=sqrt(pow(y[i],2)+pow(fy2[i],2))/fs;
}
if(flag2==0)
{
for(i=0;i<=fcx/0.5;i++)
sumx+=pow(cc3x[i+1],3)*ffx[i]/freq[i];
for(i=0;i<=fcy/0.5;i++)
sumy+=pow(cc3y[i+1],3)*ffy[i]/freq[i];
wls=7.08*pow(sumx,0.1);
wvs=7.08*pow(sumy,0.1);
}
flag1++;
sumx=sumy=0;
break;
}
case 4:
{
for(i=0;i<fs*2;i++)
{
cc4x[i]=sqrt(pow(x[i],2)+pow(fy1[i],2))/fs;
cc4y[i]=sqrt(pow(y[i],2)+pow(fy2[i],2))/fs;
}
if(flag2==0)
{
for(i=0;i<=fcx/0.5;i++)
sumx+=pow(cc4x[i+1],3)*ffx[i]/freq[i];
for(i=0;i<=fcy/0.5;i++)
sumy+=pow(cc4y[i+1],3)*ffy[i]/freq[i];
wls=7.08*pow(sumx,0.1);
wvs=7.08*pow(sumy,0.1);
}
flag1++;
sumx=sumy=0;
break;
}
case 5:
{
for(i=0;i<fs*2;i++)
{
cc5x[i]=sqrt(pow(x[i],2)+pow(fy1[i],2))/fs;
cc5y[i]=sqrt(pow(y[i],2)+pow(fy2[i],2))/fs;
}
if(flag2==0)
{
for(i=0;i<=fcx/0.5;i++)
sumx+=pow(cc5x[i+1],3)*ffx[i]/freq[i];
for(i=0;i<=fcy/0.5;i++)
sumy+=pow(cc5y[i+1],3)*ffy[i]/freq[i];
wls=7.08*pow(sumx,0.1);
wvs=7.08*pow(sumy,0.1);
}
flag1++;
sumx=sumy=0;
break;
}
case 6:
{
for(i=0;i<fs*2;i++)
{
cc6x[i]=sqrt(pow(x[i],2)+pow(fy1[i],2))/fs;
cc6y[i]=sqrt(pow(y[i],2)+pow(fy2[i],2))/fs;
}
if(flag2==0)
{
for(i=0;i<=fcx/0.5;i++)
sumx+=pow(cc6x[i+1],3)*ffx[i]/freq[i];
for(i=0;i<=fcy/0.5;i++)
sumy+=pow(cc6y[i+1],3)*ffy[i]/freq[i];
wls=7.08*pow(sumx,0.1);
wvs=7.08*pow(sumy,0.1);
}
flag1++;
sumx=sumy=0;
break;
}
case 7:
{
for(i=0;i<fs*2;i++)
{
cc7x[i]=sqrt(pow(x[i],2)+pow(fy1[i],2))/fs;
cc7y[i]=sqrt(pow(y[i],2)+pow(fy2[i],2))/fs;
}
if(flag2==0)
{
for(i=0;i<=fcx/0.5;i++)
sumx+=pow(cc7x[i+1],3)*ffx[i]/freq[i];
for(i=0;i<=fcy/0.5;i++)
sumy+=pow(cc7y[i+1],3)*ffy[i]/freq[i];
wls=7.08*pow(sumx,0.1);
wvs=7.08*pow(sumy,0.1);
}
flag1++;
sumx=sumy=0;
break;
}
case 8:
{
for(i=0;i<fs*2;i++)
{
cc8x[i]=sqrt(pow(x[i],2)+pow(fy1[i],2))/fs;
cc8y[i]=sqrt(pow(y[i],2)+pow(fy2[i],2))/fs;
}
if(flag2==0)
{
for(i=0;i<=fcx/0.5;i++)
sumx+=pow(cc8x[i+1],3)*ffx[i]/freq[i];
for(i=0;i<=fcy/0.5;i++)
sumy+=pow(cc8y[i+1],3)*ffy[i]/freq[i];
wls=7.08*pow(sumx,0.1);
wvs=7.08*pow(sumy,0.1);
}
flag1++;
sumx=sumy=0;
break;
}
case 9:
{
for(i=0;i<fs*2;i++)
{
cc9x[i]=sqrt(pow(x[i],2)+pow(fy1[i],2))/fs;
cc9y[i]=sqrt(pow(y[i],2)+pow(fy2[i],2))/fs;
}
if(flag2==0)
{
for(i=0;i<=fcx/0.5;i++)
sumx+=pow(cc9x[i+1],3)*ffx[i]/freq[i];
for(i=0;i<=fcy/0.5;i++)
sumy+=pow(cc9y[i+1],3)*ffy[i]/freq[i];
wls=7.08*pow(sumx,0.1);
wvs=7.08*pow(sumy,0.1);
}
flag1++;
sumx=sumy=0;
break;
}
case 10:
{
for(i=0;i<fs*2;i++)
{
cc10x[i]=sqrt(pow(x[i],2)+pow(fy1[i],2))/fs;
cc10y[i]=sqrt(pow(y[i],2)+pow(fy2[i],2))/fs;
}
flag1=1;
flag2=1;
break;
}
}
if(flag2==1)
{
for(i=0;i<fs*2;i++)
{
ccx[i]=(cc1x[i]+cc2x[i]+cc3x[i]+cc4x[i]+cc5x[i]+cc6x[i]+cc7x[i]+cc8x[i]+cc9x[i]+cc10x[i])/10;
ccy[i]=(cc1y[i]+cc2y[i]+cc3y[i]+cc4y[i]+cc5y[i]+cc6y[i]+cc7y[i]+cc8y[i]+cc9y[i]+cc10y[i])/10;
}
for(i=0;i<=fcx/0.5;i++)
sumx+=pow(ccx[i+1],3)*ffx[i]/freq[i];
for(i=0;i<=fcy/0.5;i++)
sumy+=pow(ccy[i+1],3)*ffy[i]/freq[i];
wls=7.08*pow(sumx,0.1);
wvs=7.08*pow(sumy,0.1);
sumx=sumy=0;
}
sx.Format(_T("%.3f"),wls);
sy.Format(_T("%.3f"),wvs);
UpdateData(TRUE);
m_strx=sx;
UpdateData(FALSE);
UpdateData(TRUE);
m_stry=sy;
UpdateData(FALSE);
for(i=0;i<7;i++)
{
strx[i]='0';
stry[i]='0';
}
_gcvt(wls,5,strx);
strx[5]=' ';
strx[6]=' ';
_gcvt(wvs,5,stry);
stry[5]=0x0D;
stry[6]=0X0A;
bFile=CreateFile(_T("\\My Documents\\test\\results.txt"),GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
GetFileTime(bFile,NULL,NULL,&filetime);
FileTimeToLocalFileTime(&filetime,&localtime);
FileTimeToSystemTime(&localtime,&st);
sprintf(stime,"%4d-%02d-%02d %02d:%02d:%02d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
stime[20]=' ';
stime[21]=' ';
FileSize=GetFileSize(bFile,NULL);
if(FileSize==0)
{
strcat(bt,fh);
SetFilePointer(bFile,0,NULL,FILE_END);
WriteFile(bFile,bt,32,&a,NULL);
}
{
SetFilePointer(bFile,0,NULL,FILE_END);
WriteFile(bFile,stime,22,&b,NULL);
SetFilePointer(bFile,0,NULL,FILE_END);
WriteFile(bFile,strx,7,&c,NULL);
SetFilePointer(bFile,0,NULL,FILE_END);
WriteFile(bFile,stry,7,&d,NULL);
}
}
void CTestDlg::rfft(double x[],double y[],int n)
{
int i,j,k,m,i1,i2,i3,i4,n1,n2,n4;
double a,e,cc,ss,xt,t1,t2;
for(j=1,i=1;i<16;i++)
{
m=i;
j=2*j;
if(j==n) break;
}
n1=n-1;
for(j=0,i=0;i<n1;i++)
{
if(i<j)
{
xt=x[j];
x[j]=x[i];
x[i]=xt;
}
k=n/2;
while(k<(j+1))
{
j=j-k;
k=k/2;
}
j=j+k;
}
for(i=0;i<n;i+=2)
{
xt=x[i];
x[i]=xt+x[i+1];
x[i+1]=xt-x[i+1];
}
n2=1;
for(k=2;k<=m;k++)
{
n4=n2;
n2=2*n4;
n1=2*n2;
e=6.28318530718/n1;
for(i=0;i<n;i+=n1)
{
xt=x[i];
x[i]=xt+x[i+n2];
x[i+n2]=xt-x[i+n2];
x[i+n2+n4]=-x[i+n2+n4];
a=e;
for(j=1;j<=(n4-1);j++)
{
i1=i+j;
i2=i-j+n2;
i3=i+j+n2;
i4=i-j+n1;
cc=cos(a);
ss=sin(a);
a=a+e;
t1=cc*x[i3]+ss*x[i4];
t2=ss*x[i3]-cc*x[i4];
x[i4]=x[i2]-t2;
x[i3]=-x[i2]-t2;
x[i2]=x[i1]-t1;
x[i1]=x[i1]+t1;
}
}
}
y[0]=y[n/2]=0.;
for(i=1;i<n/2;i++)
y[i]=x[n-i];
for(i=n/2+1;i<n;i++)
{
y[i]=-x[i];
x[i]=x[n-i];
}
}
void CTestDlg::zuotu(double xy[])
{
int i;
double a[512];
m_2DGraph.m_crLineColor = RGB(136,253,57); //曲線顏色
for(i=0;i<512;i++)
a[i]=i+1;
m_2DGraph.AppendPoint(a,xy);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -