www.pudn.com > source1.02.rar > SerialComDlg.cpp


// SerialComDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "SerialCom.h" 
#include "SerialComDlg.h" 
#include "PubSub.h" 
#include "afxmt.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
CEvent EventSend; 
CEvent EventRec; 
int oldLen; 
int check; //检测返回数据长度标志 
int low;//求平均植上下限 
int high; 
int Rlen=0;///返回数据长度 
short data[1024];//储存每一次返回的数据 
short spectrumData[1000];///储存光谱点植 
short spectrumSourse[10000]; 
int enablespe=1; //求平均制得光谱点标志 
int count=0; //光谱点计数 
int DrawEvent=0;//触发画图 
int uj=0; 
CString Err=""; 
int stop; 
FILE *wave; 
int oldY; 
int n; 
 
 
CDC *pDC;             //屏幕绘图设备 
CDC memDC;            //内存绘图设备 
int m_High;           //绘图起点 
int m_Low;            //绘图终点 
int m_lCount[1024];   //数据存储数组 
long m_now;            //记录波形当前点 
CString SendCommand; 
CString WaveFile; 
CString SpetrumFile; 
CString ReText; 
CPubSub *m_PubSub; 
UINT Send(LPVOID ); 
UINT Receive(LPVOID); 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CAboutDlg dialog used for App About 
 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// Dialog Data 
	//{{AFX_DATA(CAboutDlg) 
	enum { IDD = IDD_ABOUTBOX }; 
	//}}AFX_DATA 
 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAboutDlg) 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
	//}}AFX_VIRTUAL 
 
// Implementation 
protected: 
	//{{AFX_MSG(CAboutDlg) 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
	//{{AFX_DATA_INIT(CAboutDlg) 
	//}}AFX_DATA_INIT 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAboutDlg) 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
	//{{AFX_MSG_MAP(CAboutDlg) 
		// No message handlers 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CSerialComDlg dialog 
 
CSerialComDlg::CSerialComDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CSerialComDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CSerialComDlg) 
	m_high =262; 
	m_low = 255; 
	m_bSaveSpe = 1; 
	m_bSaveWave = 0; 
	m_AVA = 0; 
	m_High =512; 
	m_N = 3; 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
	 
	m_ComNo=1; 
	m_ComBaut=38400; 
	m_ComData=8; 
	m_ComStop=0; 
	m_ComParity=0; 
	m_PubSub=NULL; 
 
	m_PubSub=new CPubSub; 
} 
 
void CSerialComDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CSerialComDlg) 
	DDX_Text(pDX, IDC_HIGH, m_high); 
	DDX_Text(pDX, IDC_LOW, m_low); 
	DDX_Check(pDX, IDC_SAVESPECTRUM, m_bSaveSpe); 
	DDX_Check(pDX, IDC_SaveWaveData, m_bSaveWave); 
	DDX_Radio(pDX, IDC_AVA, m_AVA); 
	DDX_Text(pDX, IDC_ponitnum, m_High); 
	DDX_Text(pDX, IDC_AVAN, m_N); 
	DDV_MinMaxInt(pDX, m_N, 1, 20); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CSerialComDlg, CDialog) 
   //{{AFX_MSG_MAP(CSerialComDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_BN_CLICKED(IDC_OPENCOM, OnOpencom) 
	ON_BN_CLICKED(IDC_SEND, OnSend) 
	ON_WM_CLOSE() 
	ON_WM_TIMER() 
	ON_BN_CLICKED(IDC_CLR_SEND, OnClrSend) 
	ON_BN_CLICKED(IDC_CLR_REC, OnClrRec) 
	ON_EN_CHANGE(IDC_EDIT_SEND, OnChangeEditSend) 
	ON_BN_CLICKED(IDC_CLR_AUTO, OnClrAuto) 
	ON_BN_CLICKED(IDC_CLR_STOP, OnClrStop) 
	ON_BN_CLICKED(IDC_AVA, OnAva) 
	ON_BN_CLICKED(IDC_BUTTON1, OnReset) 
	ON_BN_CLICKED(IDC_CHANGEXRAY, OnChangexray) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CSerialComDlg message handlers 
 
BOOL CSerialComDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// Add "About..." menu item to system menu. 
 
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// 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 
	 
	// TODO: Add extra initialization here 
	ComDlgInit(); 
	m_Low = 0; 
//	m_High = 1024; 
	m_now =0; 
 
	SetTimer(1,20,NULL); 
	SetTimer(100,100,NULL); 
	m_AVA=1; 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CSerialComDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CSerialComDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CSerialComDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
void CSerialComDlg::ComDlgInit() 
{ 
	//串口号 
	int i; 
	char pp[20]; 
	for(i=1;i<=256;i++) 
	{ 
		sprintf(pp,"串口%d",i); 
		SendDlgItemMessage(IDC_SEL_COM,CB_ADDSTRING,0,LPARAM(pp)); 
	} 
	SendDlgItemMessage(IDC_SEL_COM,CB_SETCURSEL,m_ComNo-1,0); 
 
	//波特率 
	SendDlgItemMessage(IDC_SEL_BAUT,CB_ADDSTRING,0,LPARAM("110")); 
	SendDlgItemMessage(IDC_SEL_BAUT,CB_ADDSTRING,0,LPARAM("300")); 
	SendDlgItemMessage(IDC_SEL_BAUT,CB_ADDSTRING,0,LPARAM("600")); 
	SendDlgItemMessage(IDC_SEL_BAUT,CB_ADDSTRING,0,LPARAM("1200")); 
	SendDlgItemMessage(IDC_SEL_BAUT,CB_ADDSTRING,0,LPARAM("2400")); 
	SendDlgItemMessage(IDC_SEL_BAUT,CB_ADDSTRING,0,LPARAM("4800")); 
	SendDlgItemMessage(IDC_SEL_BAUT,CB_ADDSTRING,0,LPARAM("9600")); 
	SendDlgItemMessage(IDC_SEL_BAUT,CB_ADDSTRING,0,LPARAM("14400")); 
	SendDlgItemMessage(IDC_SEL_BAUT,CB_ADDSTRING,0,LPARAM("19200")); 
	SendDlgItemMessage(IDC_SEL_BAUT,CB_ADDSTRING,0,LPARAM("38400")); 
	SendDlgItemMessage(IDC_SEL_BAUT,CB_ADDSTRING,0,LPARAM("56000")); 
	SendDlgItemMessage(IDC_SEL_BAUT,CB_ADDSTRING,0,LPARAM("57600")); 
	SendDlgItemMessage(IDC_SEL_BAUT,CB_ADDSTRING,0,LPARAM("115200")); 
	SendDlgItemMessage(IDC_SEL_BAUT,CB_ADDSTRING,0,LPARAM("128000")); 
	SendDlgItemMessage(IDC_SEL_BAUT,CB_ADDSTRING,0,LPARAM("256000")); 
	SetDlgItemInt(IDC_SEL_BAUT,m_ComBaut); 
 
	//数据位 
	SendDlgItemMessage(IDC_SEL_DATA,CB_ADDSTRING,0,LPARAM("6")); 
	SendDlgItemMessage(IDC_SEL_DATA,CB_ADDSTRING,0,LPARAM("7")); 
	SendDlgItemMessage(IDC_SEL_DATA,CB_ADDSTRING,0,LPARAM("8")); 
	SendDlgItemMessage(IDC_SEL_DATA,CB_SETCURSEL,m_ComData-6,0); 
	 
	//停止位 
	SendDlgItemMessage(IDC_SEL_STOP,CB_ADDSTRING,0,LPARAM("1位")); 
	SendDlgItemMessage(IDC_SEL_STOP,CB_ADDSTRING,0,LPARAM("1.5位")); 
	SendDlgItemMessage(IDC_SEL_STOP,CB_ADDSTRING,0,LPARAM("2位")); 
	SendDlgItemMessage(IDC_SEL_STOP,CB_SETCURSEL,m_ComStop,0); 
	 
	//校验 
	SendDlgItemMessage(IDC_SEL_PARITY,CB_ADDSTRING,0,LPARAM("无校验")); 
	SendDlgItemMessage(IDC_SEL_PARITY,CB_ADDSTRING,0,LPARAM("奇校验")); 
	SendDlgItemMessage(IDC_SEL_PARITY,CB_ADDSTRING,0,LPARAM("偶校验")); 
	SendDlgItemMessage(IDC_SEL_PARITY,CB_SETCURSEL,m_ComParity,0); 
 
	GetDlgItem(IDC_SEND)->EnableWindow(FALSE); 
	GetDlgItem(IDC_CLR_AUTO)->EnableWindow(FALSE); 
	GetDlgItem(IDC_CLR_STOP)->EnableWindow(FALSE); 
} 
 
void CSerialComDlg::EnableCom() 
{ 
	GetDlgItem(IDC_SEL_COM)->EnableWindow(TRUE); 
	GetDlgItem(IDC_SEL_BAUT)->EnableWindow(TRUE); 
	GetDlgItem(IDC_SEL_DATA)->EnableWindow(TRUE); 
	GetDlgItem(IDC_SEL_STOP)->EnableWindow(TRUE); 
	GetDlgItem(IDC_SEL_PARITY)->EnableWindow(TRUE); 
	GetDlgItem(IDC_SEND)->EnableWindow(FALSE); 
	GetDlgItem(IDC_CLR_AUTO)->EnableWindow(FALSE); 
	GetDlgItem(IDC_CLR_STOP)->EnableWindow(FALSE); 
} 
 
void CSerialComDlg::DisableCom() 
{ 
	GetDlgItem(IDC_SEL_COM)->EnableWindow(FALSE); 
	GetDlgItem(IDC_SEL_BAUT)->EnableWindow(FALSE); 
	GetDlgItem(IDC_SEL_DATA)->EnableWindow(FALSE); 
	GetDlgItem(IDC_SEL_STOP)->EnableWindow(FALSE); 
	GetDlgItem(IDC_SEL_PARITY)->EnableWindow(FALSE); 
	GetDlgItem(IDC_SEND)->EnableWindow(TRUE); 
	GetDlgItem(IDC_CLR_AUTO)->EnableWindow(TRUE); 
	GetDlgItem(IDC_CLR_STOP)->EnableWindow(TRUE); 
} 
 
void CSerialComDlg::GetComPara() 
{ 
	m_ComNo=SendDlgItemMessage(IDC_SEL_COM,CB_GETCURSEL)+1; 
	m_ComBaut=GetDlgItemInt(IDC_SEL_BAUT); 
	m_ComData=SendDlgItemMessage(IDC_SEL_DATA,CB_GETCURSEL)+6; 
	m_ComStop=SendDlgItemMessage(IDC_SEL_STOP,CB_GETCURSEL); 
	m_ComParity=SendDlgItemMessage(IDC_SEL_PARITY,CB_GETCURSEL); 
} 
 
//=========================================================== 
//数组命令集 
//=========================================================== 
CString Commands[14]={ ":CHAN1:OFFS?\n", ":TIM:SCAL?\n",":CHAN1:SCAL?\n", ":TIM:DEL?\n", ":CHAN1:DISP?\n", "*IDN?\n",":CHAN1:COUP?\n", ":TRIG:TYP?\n", ":TRIG:SOUR?\n", ":TRIG:LEV?\n", ":TRIG:SLOP?\n", ":TRIG:COUP?\n", ":ACQ:MOD?\n", ":ACQ1:POIN\n"}; 
 
 
//=========================================================== 
// 功能:打开资源 
// 参数:ComNo:串口号,Baut:波特率,Data:数据位,Stop:停止位 
//       Parity:校验位,cbInBuf:输入队列大小,cbOutBuf:输出队列大小 
//=========================================================== 
void CSerialComDlg::OnOpencom()  
{ 
	GetComPara(); 
	if(m_PubSub->m_hCom==INVALID_HANDLE_VALUE) 
	{ 
		if(m_PubSub->OpenCom(m_ComNo,m_ComBaut,m_ComData,m_ComStop,m_ComParity,1024,1024)) 
		{ 
			SetDlgItemText(IDC_OPENCOM,"关闭"); 
			SetDlgItemText(IDC_DISP,"串口打开成功!"); 
			DisableCom(); 
 
		} 
		else 
			SetDlgItemText(IDC_DISP,"串口打开失败!"); 
	} 
	else 
	{ 
		if(m_PubSub->CloseCom()) 
		{ 
			SetDlgItemText(IDC_OPENCOM,"打开"); 
			SetDlgItemText(IDC_DISP,"串口关闭成功!"); 
			EnableCom(); 
 
		} 
		else 
			SetDlgItemText(IDC_DISP,"串口关闭失败!"); 
	} 
 
} 
 
//发送数据 
void CSerialComDlg::OnSend()  
{ 
 
	CString SendText; 
	BYTE SendBuf[1024]; 
	GetDlgItemText(IDC_EDIT_SEND,SendText); 
	int len=SendText.GetLength(); 
	 
	if(len==0) 
	{ 
		SetDlgItemText(IDC_DISP,"请输入发送数据!"); 
		return; 
	} 
	for(int i=0;iWriteCom(SendBuf,len)) 
		SetDlgItemText(IDC_DISP,"数据发送成功!"); 
	else 
		SetDlgItemText(IDC_DISP,"数据发送失败!"); 
} 
 
//接收数据 
void CSerialComDlg::OnTimer(UINT nIDEvent) 
{ 
	BYTE RecBuf[1024]; 
	CString RecText; 
	int RlenS,oldLen; 
 
	if(uj==1&&nIDEvent==100) 
	{ 
		if(m_PubSub->m_hCom!=INVALID_HANDLE_VALUE) 
		{ 
			RlenS=m_PubSub->GetDataLen(); 
			if(RlenS>0) 
			{ 
				m_PubSub->ReadCom(RecBuf,RlenS); 
				GetDlgItemText(IDC_EDIT_REC,RecText); 
				oldLen=RecText.GetLength(); 
				for(int i=0;im_hCom!=INVALID_HANDLE_VALUE) 
			{ 
			 
			Rlen=m_PubSub->GetDataLen(); 
			 
			if(Rlen>0) 
			{ 
			if(Rlen==1014)  
				{ 
					//				AfxMessageBox("kj"); 
					EventRec.SetEvent();  
					//AfxMessageBox("kj"); 
			 
				} 
//				else t++; 
//				if(t>100) 
//				{ 
//					EventRec.SetEvent(); 
//					SetDlgItemText(IDC_DISP,"返回数据异常!"); 
//				} 
		 
			} 
 
		} 
	} 
	 
	if(DrawEvent==1) 
	{ 
	CRect rect; 
	SetDlgItemText(IDC_EDIT_REC,ReText); 
	SetDlgItemText(IDC_DISP,Err); 
	ReText=""; 
	 
	// 获取绘制坐标的文本框 
	CWnd* pWnd = GetDlgItem(IDC_DRAW); 
	 
	pWnd->GetClientRect(&rect); 
	// 指针	 
	 
		//Event.Lock; 
	pDC = pWnd->GetDC();	 
	pWnd->Invalidate(); 
	pWnd->UpdateWindow(); 
	 
	//pDC->Rectangle(&rect); 
 
	 
    //内存绘图 
    CBitmap memBitmap; 
	CBitmap* pOldBmp = NULL; 
	memDC.CreateCompatibleDC(pDC); 
	memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom); 
	pOldBmp = memDC.SelectObject(&memBitmap); 
	memDC.BitBlt(rect.left,rect.top,rect.right,rect.bottom,pDC,0,0,SRCCOPY); 
	DrawWave(&memDC); 
	pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&memDC,0,0,SRCCOPY); 
 
	memDC.SelectObject(pOldBmp); 
	memDC.DeleteDC(); 
	memBitmap.DeleteObject(); 
    pWnd->ReleaseDC(pDC); 
	DrawEvent=0; 
	} 
	CDialog::OnTimer(nIDEvent); 
} 
 
//清空发送数据 
void CSerialComDlg::OnClrSend() 
{ 
	SetDlgItemText(IDC_EDIT_SEND,""); 
} 
 
//清空接收数据 
void CSerialComDlg::OnClrRec()  
{ 
	SetDlgItemText(IDC_EDIT_REC,""); 
} 
 
//自动发送命令 
void CSerialComDlg::OnClrAuto()  
{ 
 
	stop=1; 
	UpdateData(TRUE); 
	low=m_low; 
	high=m_high; 
	n=m_N; 
	 
	GetDlgItem(IDC_CLR_STOP)->EnableWindow(TRUE); 
	GetDlgItem(IDC_CLR_AUTO)->EnableWindow(FALSE); 
	GetDlgItem(IDC_OPENCOM)->EnableWindow(FALSE); 
	AfxBeginThread(Send,NULL); 
	AfxBeginThread(Receive,NULL); 
 
 
} 
 
//停止发送 
void CSerialComDlg::OnClrStop()  
{	 
	GetDlgItem(IDC_CLR_STOP)->EnableWindow(FALSE); 
	GetDlgItem(IDC_CLR_AUTO)->EnableWindow(TRUE); 
	GetDlgItem(IDC_OPENCOM)->EnableWindow(TRUE); 
	stop=0; 
	UpdateData(TRUE); 
	 
	if(wave) fclose(wave); 
	//	WaitForSingleObject(Close,INFINITE);  
	 
   if(!m_bSaveWave)  
	{ 
		CFile   TempFile; 
		CFileFind FindWave; 
		if(FindWave.FindFile(WaveFile)) 
		{ 
//	if	(fclose(wave)) 
				TempFile.Remove(WaveFile); 
		} 
	} 
/////////////////////////////////////////////////// 
	if(m_bSaveSpe) 
	{ 
		CString spetrumTem; 
		CString spetrumText; 
		CString currentTime; 
		CTime m_time= CTime::GetCurrentTime();//获取当前日期 
    	currentTime=m_time.Format("%y%m%d-");//以日期为保存文件名的前缀 
//		SpetrumFile="SpetrumData"+currentTime+".txt"; 
		char buf[30]; 
		for(int j=0;j<1000;j++) 
		{ 
		   sprintf(buf,"SD"+currentTime+"%03d"+".txt",j);//以日期+3位数据做文件名 
 
           CFileFind findFile;  
 
       if(!findFile.FindFile (buf))//只要发现没有同名则采用该名字作为文件名 
					break; 
		} 
		for(j=0;j<35;j++) SpetrumFile.SetAt(j,buf[j]); 
		FILE *spetrum; 
		spetrum=fopen(SpetrumFile,"wb"); 
		for(int i=0;i0) fprintf(spetrum,spetrumText); 
		count=0; 
		spetrumText=""; 
		fclose(spetrum); 
 
	} 
		 
} 
 
//程序退出处理 
void CSerialComDlg::ExitPrg() 
{ 
	if(m_PubSub->m_hCom!=INVALID_HANDLE_VALUE) 
		m_PubSub->CloseCom(); 
	 
	if(m_PubSub!=NULL) 
	{ 
		delete m_PubSub; 
		m_PubSub=NULL; 
	} 
} 
 
void CSerialComDlg::OnOK()  
{ 
	ExitPrg(); 
	CDialog::OnOK(); 
} 
 
void CSerialComDlg::OnClose()  
{ 
	ExitPrg(); 
	CDialog::OnClose(); 
} 
 
void CSerialComDlg::OnChangeEditSend()  
{ 
	// TODO: If ths is a RICHEDIT control, the control will not 
	// send this notification unless you override the CDialog::OnInitDialog() 
	// function and call CRichEditCtrl().SetEventMask() 
	// with the ENM_CHANGE flag ORed into the mask. 
	 
	// TODO: Add your control notification handler code herei 
	 
} 
 
UINT Send(LPVOID p) 
{ 
	CString AutoAquireText; 
	BYTE SendBuf[500]; 
	int len; 
	AutoAquireText=Commands[13]; 
	len=AutoAquireText.GetLength(); 
//	AfxEndThread(0) *endSend; 
	while(1) 
	{ 
		if(stop==0) ::AfxEndThread(0); 
		for(int i=0;iWriteCom(SendBuf,len)) 
		{ 
			for(int i=0;i<3||m_PubSub->WriteCom(SendBuf,len);i++) {Sleep(5);} 
			if(i>=3) 
			{ 
				AfxMessageBox("发送数据失败!"); 
				return 1000;///////////////////////////////////错误码为100 
			} 
		} 
		check=1; 
		EventSend.Lock(); 
 
	} 
} 
 
UINT Receive(LPVOID p) 
{ 
 
	 
	BYTE RecBuf[1500]; 
	CString RecTextAuto[1024];  
	CString ReTextTem; 
 
	CString currentTime; 
	int counts=0; 
	int sum=0; 
	int sum2=0; 
	CTime m_time= CTime::GetCurrentTime();//获取当前日期 
    currentTime=m_time.Format("%y%m%d-");//以日期为保存文件名的前缀 
//	WaveFile="Wave"+currentTime+".txt"; 
	char buf[30]; 
	for(int j=0;j<1000;j++) 
	{ 
		sprintf(buf,"Wave"+currentTime+"%03d"+".txt",j);//以日期+3位数据做文件名 
 
        CFileFind findFile;  
 
        if(!findFile.FindFile (buf))//只要发现没有同名则采用该名字作为文件名 
					break; 
		} 
		for(j=0;j<30;j++) WaveFile.SetAt(j,buf[j]); 
		if(!(wave=fopen(WaveFile,"wb"))) 
	{ 
		AfxMessageBox("不能打开文件!"); 
		 
	} 
	fseek (wave, 0L, SEEK_SET); 
	while(1) 
	{ 
		if(stop==0) ::AfxEndThread(0); 
 
		EventRec.Lock(500); 
		if(Rlen>0) 
		{ 
 
			check=0; 
			short temp; 
			m_PubSub->ReadCom(RecBuf,Rlen); 
			for(int i=14,j=0;i10000)  
				{ 
					AfxMessageBox("光谱点数超出1000!"); 
					return 1000; 
				} 
				spectrumSourse[counts++]=sum/(high-low+1); 
				if((counts%n)!=0) sum2 +=spectrumSourse[i-1]; 
				else  
				{	spectrumData[count++]=sum2/n; 
					sum2=0; 
				} 
				sum=0; 
			    DrawEvent=1;///////////////////////////////// 触发画图 
			} 
			for(i=0;i<500;i++)  
			{ 
				ReTextTem.Format("%d\n",data[i]); 
				ReText+=ReTextTem; 
 
			} 
	Rlen=0; 
//		SetDlgItemText(IDC_EDIT_REC,ReText); 
			fprintf(wave,ReText); 
			 
			Err="接收成功!"; 
			EventSend.SetEvent(); 
			 
		 
		} 
		else  
		{ 
			 
			Err="没有数据返回!!"; 
			EventSend.SetEvent(); 
		 
		} 
	} 
 
return 1002; 
} 
 
 
 
 
 
 
void CSerialComDlg::OnAva()  
{ 
//	enablespe=1;	 
} 
 
void CSerialComDlg::DrawWave(CDC *pDC) 
{ 
	CRect rect; 
	 
	CString str; 
	int i; 
	int m_left,m_top,m_right,m_bottom; 
	 
    int m_Interval = (m_High - m_Low)/10; 
	if (m_Interval < 1)  m_Interval = 1; 
	 
	// 获取绘制坐标的文本框 
	CWnd* pWnd = GetDlgItem(IDC_DRAW); 
	 
	pWnd->GetClientRect(&rect); 
	pDC->Rectangle(&rect); 
	 
	 
    m_left = rect.left+10; 
	m_top = rect.top+10; 
	m_right = rect.right-10; 
	m_bottom = rect.bottom-20; 
	 
	int m_IntervalPan = (m_right - m_left)/11; 
	if (m_IntervalPan < 1 ) m_IntervalPan =1; 
	 
	// 创建画笔对象 
	CPen* pPenRed = new CPen; 
	 
	// 红色画笔 
	pPenRed->CreatePen(PS_SOLID,1,RGB(255,0,0)); 
	 
	// 创建画笔对象 
	CPen* pPenBlue = new CPen; 
	 
	// 蓝色画笔 
	pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0, 255)); 
	 
	// 创建画笔对象 
	CPen* pPenGreen = new CPen; 
	 
	// 绿色画笔 
	pPenGreen->CreatePen(PS_DOT,1,RGB(0,255,0)); 
	 
	// 选中当前红色画笔,并保存以前的画笔 
	CGdiObject* pOldPen = pDC->SelectObject(pPenRed); 
	 
	// 绘制坐标轴 
	pDC->MoveTo(m_left,m_top); 
	 
	// 垂直轴 
	pDC->LineTo(m_left,m_bottom); 
	 
	// 水平轴 
	pDC->LineTo(m_right,m_bottom); 
	 
	 
	// 写X轴刻度值 
	for(i=0;i<10;i++) 
	{ 
 
		str.Format(_T("%d"),m_Low+i*m_Interval); 
		pDC->TextOut(m_left+i*m_IntervalPan,m_bottom+3,str);		 
	} 
	//str.Format(_T("%d"),m_Max); 
	str.Format(_T("%d"),m_High); 
	pDC->TextOut(m_left+10*m_IntervalPan,m_bottom+3,str);		 
	 
	 
	// 绘制X轴刻度 
	for (i = m_left; i < m_right-20; i += 5) 
	{ 
		if ((i & 1) == 0) 
		{ 
			// 10的倍数,最低位比较 
			pDC->MoveTo(i + 10, m_bottom); 
			pDC->LineTo(i + 10, m_bottom+4); 
		} 
		else 
		{ 
			// 10的倍数 
			pDC->MoveTo(i + 10, m_bottom); 
			pDC->LineTo(i + 10, m_bottom+2); 
		} 
	} 
	 
	// 绘制Y轴箭头 
	pDC->MoveTo(m_right-5,m_bottom-5); 
	pDC->LineTo(m_right,m_bottom); 
	pDC->LineTo(m_right-5,m_bottom+5); 
	 
	// 绘制X轴箭头	 
	pDC->MoveTo(m_left-5,m_top+5); 
	pDC->LineTo(m_left,m_top); 
	pDC->LineTo(m_left+5,m_top+5); 
	 
 
	 
	// 绘制Y轴网格 选择绿色画笔 
    pDC->SelectObject(pPenGreen);	 
    // 
	int iTemp = (m_bottom  - m_top)/5; 
    for (i = 1 ;i <= 5 ;i++) 
	{ 
		pDC->MoveTo(m_left,m_bottom - i*iTemp); 
		pDC->LineTo(m_right,m_bottom - i*iTemp); 
	} 
 
    //数组赋值 
//	if(m_now<1024) 
//	{ 
	    m_now++; 
//	} 
//	else //if(m_now<3*1024) 
//	{ 
//		m_now++;//)%m_High+m_High; 
//	} 
	//else m_now=1024; 
 
 
	long xTemp; 
	int yTemp; 
	long oldX; 
	long m_limit; 
	// 更改成蓝色画笔 
	pDC->SelectObject(pPenBlue); 
	if(m_nowMoveTo(m_left,oldY); 
	for (i = m_Low; i <= m_limit; i=i++) 
	{		 
			 
		xTemp = m_right+(i-m_now)*m_IntervalPan/m_Interval; 
		yTemp = m_bottom/2-60 - (int) (spectrumData[i] * m_bottom / 150); 
		if(i==m_Low){ 
			oldX=xTemp; 
            oldY=yTemp; 
		} 
		//yTemp = m_bottom/2 - (int) (m_lCount[i] * m_bottom / 1024); 
	//	if (yTemp < m_top) yTemp = m_top; 
		if((xTemp >=m_left)&&(xTemp <=m_right)) 
		{ 
		//	pDC->MoveTo(xTemp, m_bottom/2); 
            // 
			pDC->LineTo(xTemp, yTemp); 
 
		} 
	} 
	// 恢复以前的画笔 
	pDC->SelectObject(pOldPen);	 
	 
	delete pPenRed; 
	delete pPenBlue; 
	delete pPenGreen; 
	return; 
} 
 
void CSerialComDlg::OnReset()  
{ 
	// TODO: Add your control notification handler code here 
	for(int i=0;i<10000;i++)  spectrumData[i]=0; 
	m_now=0; 
	count=0; 
} 
 
 
 
void CSerialComDlg::OnChangexray()  
{ 
	UpdateData(TRUE);	 
}