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 &amt; 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 &amt; 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(&amt;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;i<len;i++)
SendBuf[i]=SendText.GetAt(i);
if(m_PubSub->WriteCom(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&amt;&amt;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;i<RlenS;i++)
{
if(RecBuf[i]<32)
RecText.Insert(oldLen+i,'.');
else
RecText.Insert(oldLen+i,RecBuf[i]);
}
SetDlgItemText(IDC_EDIT_REC,RecText);
}
}
}

int t=0;
if(check==1&amt;&amt;nIDEvent==1)
{


if(m_PubSub->m_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(&amt;rect);
// 指针

//Event.Lock;
pDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();

//pDC->Rectangle(&amt;rect);


//内存绘图
CBitmap memBitmap;
CBitmap* pOldBmp = NULL;
memDC.CreateCompatibleDC(pDC);
memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
pOldBmp = memDC.SelectObject(&amt;memBitmap);
memDC.BitBlt(rect.left,rect.top,rect.right,rect.bottom,pDC,0,0,SRCCOPY);
DrawWave(&amt;memDC);
pDC->BitBlt(rect.left,rect.top,rect.right,rect.bottom,&amt;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;i<count;i++)
{
spetrumTem.Format(">d\n",spectrumData[i]);
spetrumText+=spetrumTem;
}
if(count>0) 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;i<len;i++)
SendBuf[i]=AutoAquireText.GetAt(i);
if(!m_PubSub->WriteCom(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;i<Rlen;)//从第15个接收字节开始为波形数据
{
temp=RecBuf[i++];
temp=temp<<8;//先接收到的为高8位数据,因此先将其移向高位再与之后低8位数据相加
temp+=RecBuf[i++];
data[j++]=temp;
}
Rlen=0;

if(enablespe)
{
for(int i=low;i<=high;i++) sum+=data[i];
if(counts>10000)
{
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(&amt;rect);
pDC->Rectangle(&amt;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 &amt; 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_now<m_High) m_limit = m_High;
else
m_limit =m_now;
pDC->MoveTo(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)&amt;&amt;(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);
}