www.pudn.com > Comtestdlg.rar > ComtestDlg.cpp


// ComtestDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "Comtest.h" 
#include "ComtestDlg.h" 
#include "afxtempl.h"			//模板 
  
 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
#define IDS_MAILADDR	_T("mailto:Zhaoem82@163.com")         // Email 
///////////////////////////////////////////////////////////////////////////// 
// 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: 
	CHyperLink	m_ABEMailLink;                         //超键接收效果的Static 
	//{{AFX_MSG(CAboutDlg) 
	virtual BOOL OnInitDialog(); 
	//}}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 
	DDX_Control(pDX, IDC_ABEMAILLINK, m_ABEMailLink);     
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
	//{{AFX_MSG_MAP(CAboutDlg) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
BOOL CAboutDlg::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	 
	// TODO: Add extra initialization here 
	m_ABEMailLink.SetURL(IDS_MAILADDR); 
	m_ABEMailLink.SetUnderline(CHyperLink::ulAlways); 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CComtestDlg dialog 
 
CComtestDlg::CComtestDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CComtestDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CComtestDlg) 
	m_strRXData = _T(""); 
	m_strTXData = _T(""); 
	m_bAutoSend = FALSE; 
	m_nCom = -1; 
	m_nBtl = -1; 
	m_nSgw = -1; 
	m_nStopb = -1; 
	m_nXyw = -1; 
	m_nSendTime = 0; 
	m_strComStatus = _T(""); 
	m_strRxCount = _T(""); 
	m_strTxCount = _T(""); 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	//对话框不要下面语句才能使用动态图标 
//	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
	// End Rajesh Parikh (MCSD) 
    m_bmpLedOff.LoadBitmap(IDB_LEDOFF); 
	m_bmpLedOn.LoadBitmap (IDB_LEDON); 
} 
 
void CComtestDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CComtestDlg) 
	DDX_Control(pDX, IDC_COMLED, m_ctrlComLed); 
	DDX_Control(pDX, IDC_COMSTATUS, m_ctrlComStatus); 
	DDX_Control(pDX, IDC_EDIT_RXDATA, m_ctrlRxData); 
	DDX_Control(pDX, IDC_COMCONCTRL, m_ctrlComctl); 
	DDX_Control(pDX, IDC_CHECK_HEXDISPLAY, m_ctrlHexDisplay); 
	DDX_Control(pDX, IDC_CHECK_HEXSEND, m_ctrlHexSend); 
	DDX_Text(pDX, IDC_EDIT_RXDATA, m_strRXData); 
	DDX_Text(pDX, IDC_EDIT_TXDATA, m_strTXData); 
	DDX_Control(pDX, IDC_MSCOMM1, m_ctrlComm); 
	DDX_Check(pDX, IDC_AUTOSEND, m_bAutoSend); 
	DDX_CBIndex(pDX, IDC_SETCOM, m_nCom); 
	DDX_CBIndex(pDX, IDC_SETBTL, m_nBtl); 
	DDX_CBIndex(pDX, IDC_SETSGW, m_nSgw); 
	DDX_CBIndex(pDX, IDC_SETSTOPB, m_nStopb); 
	DDX_CBIndex(pDX, IDC_SETXYW, m_nXyw); 
	DDX_Text(pDX, IDC_SENDTIME, m_nSendTime); 
	DDX_Text(pDX, IDC_COMSTATUS, m_strComStatus); 
	DDX_Text(pDX, IDC_RXCOUNT, m_strRxCount); 
	DDX_Text(pDX, IDC_TXCOUNT, m_strTxCount); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CComtestDlg, CDialog) 
	//{{AFX_MSG_MAP(CComtestDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_WM_TIMER() 
	ON_WM_CREATE() 
	ON_WM_DESTROY() 
	ON_WM_SIZE() 
	ON_BN_CLICKED(IDC_BUTTON_MANUALSEND, OnButtonManualsend) 
	ON_BN_CLICKED(IDC_AUTOSEND, OnAutosend) 
	ON_CBN_SELCHANGE(IDC_SETCOM, OnSelchangeSetcom) 
	ON_CBN_SELCHANGE(IDC_SETBTL, OnSelchangeSetbtl) 
	ON_CBN_SELCHANGE(IDC_SETSGW, OnSelchangeSetsgw) 
	ON_CBN_SELCHANGE(IDC_SETSTOPB, OnSelchangeSetstopb) 
	ON_CBN_SELCHANGE(IDC_SETXYW, OnSelchangeSetxyw) 
	ON_EN_UPDATE(IDC_SENDTIME, OnUpdateSendtime) 
	ON_BN_CLICKED(IDC_COMCONCTRL, OnCtrlCom) 
	ON_BN_CLICKED(IDC_RESCOUNT, OnRescount) 
	ON_BN_CLICKED(IDC_CLEARRXDATA, OnClearrxdata) 
	ON_BN_CLICKED(IDC_CLEARTXDATA, OnCleartxdata) 
	ON_BN_CLICKED(IDC_OPENSENDFILE, OnOpensendfile) 
	ON_BN_CLICKED(IDC_SAVEDATA, OnSavedata) 
	ON_WM_SIZING() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
//一组宏完成对话框resize后控件位置和大小 
    BEGIN_EASYSIZE_MAP(CComtestDlg) 
    EASYSIZE(IDC_EDIT_RXDATA,ES_BORDER,ES_BORDER,ES_BORDER,ES_BORDER,0) 
    EASYSIZE(IDC_STATIC1,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_STATIC2,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_STATIC3,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_STATIC4,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_STATIC5,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_STATIC6,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_STATIC7,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
    EASYSIZE(IDC_STATIC8,ES_BORDER,IDC_EDIT_RXDATA,ES_BORDER,ES_KEEPSIZE,0) 
    EASYSIZE(IDC_STATIC9,ES_BORDER,IDC_EDIT_RXDATA,ES_BORDER,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_SETCOM,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_SETBTL,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_SETXYW,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_SETSGW,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_SETSTOPB,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_COMCONCTRL,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_CHECK_HEXDISPLAY,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_CLEARRXDATA,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_OPENSENDFILE,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_SAVEDATA,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_CHECK_HEXSEND,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_CLEARTXDATA,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_AUTOSEND,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_SENDTIME,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_BUTTON_MANUALSEND,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_EDIT_TXDATA,ES_BORDER,IDC_EDIT_RXDATA,ES_BORDER,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_COMSTATUS,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_TXCOUNT,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_RXCOUNT,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_RESCOUNT,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
	EASYSIZE(IDC_COMLED,ES_BORDER,IDC_EDIT_RXDATA,ES_KEEPSIZE,ES_KEEPSIZE,0) 
    END_EASYSIZE_MAP 
 
///////////////////////////////////////////////////////////////////////////// 
// CComtestDlg message handlers 
 
BOOL CComtestDlg::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); 
		} 
	} 
    //m_EMailLink.setbk 
	//设置接收框位置 
	RECT CRect; 
	GetWindowRect(&CRect); 
    m_ctrlRxData.MoveWindow (0,0,CRect.right-12,270,TRUE); 
	INIT_EASYSIZE;         //一组宏完成对话框resize后控件位置和大小 
	// Set the icon for this dialog.  The framework does this automatically 
	//  when the application's main window is not a dialo 
	//注消以下两行 
	//SetIcon(m_hIcon, TRUE);			// Set big icon 
//	SetIcon(m_hIcon, FALSE);		// Set small icon 
	// TODO: Add extra initialization here 
	//对话框初始化 
	m_nCom=0;                 //串口1 
	m_nBtl=5;                 //波特率 9600 
	m_nSgw=2;                 //数据位 8位 
	m_nStopb=0;               //停止位 1位 
	m_nXyw=0;                 //校验位  NONE 
	m_nSendTime=1000;         //定时发送时间 
	m_bCtrlCom=0;             //串口置关闭状态 
	m_nTxCount=0;             //发送计数 
	m_nRxCount=0;             //接收计数 
	m_strTxCount.Format("TX:%d",m_nTxCount);        //发送计数显示 
	m_strRxCount.Format("RX:%d",m_nRxCount);        //接收计数显示 
	UpdateData(FALSE);        //更新显示 
    // 串口初始化 
	m_ctrlComm.SetCommPort(1);     //设置串口  
    if(!m_ctrlComm.GetPortOpen()) 
 	{ 
		m_ctrlComm.SetPortOpen(TRUE);  //打开串口 
	    m_bCtrlCom=1;                   //串口置打开状态 
	    m_ctrlComctl.SetWindowText("关闭串口"); 
		m_ctrlComLed.SetBitmap (m_bmpLedOn); 
	} 
    else 
   { 
		AfxMessageBox("没有发现串口"); 
	    m_bCtrlCom=0;                        //串口置关闭状态 
		m_ctrlComctl.SetWindowText("打开串口"); 
		m_ctrlComLed.SetBitmap (m_bmpLedOff); 
	} 
    //m_ctrlComm.SetSettings("9600,n,8,1");  //波特率9600,无校验,8个数据位,1个停止位  
    ChangeCom();        	                //设置串口状态改变串口状态 
	m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据 
    m_ctrlComm.SetRThreshold(1);  
    //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件 
    m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0 
    m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CComtestDlg::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 CComtestDlg::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 CComtestDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
void CComtestDlg::OnTimer(UINT nIDEvent)  
{    
	switch(nIDEvent) 
	{ 
	case 99:     //改变窗口图标 
		m_animIcon.ShowNextImage();break; 
	case 1: 
		OnButtonManualsend();break;        //定时到发送 
	} 
} 
 
 
int CComtestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CDialog::OnCreate(lpCreateStruct) == -1) 
		return -1; 
	m_animIcon.SetImageList(IDB_ANIM_IMGLIST,4,RGB(0,0,0)); 
	// set the timer to fire every .5 seconds 
	m_timerID = this->SetTimer(99,100,NULL);	 
	return 0; 
} 
 
void CComtestDlg::OnDestroy()  
{ 
	CDialog::OnDestroy();	 
	if(m_timerID != 0) 
	KillTimer(m_timerID); 
	 
 
	 
} 
 
void CComtestDlg::OnSize(UINT nType, int cx, int cy)  
{ 
	CDialog::OnSize(nType, cx, cy); 
	UPDATE_EASYSIZE;                       //一组宏完成对话框resize后控件位置和大小 
    
 
	 
	 
	 
} 
 
void CComtestDlg::OnButtonManualsend()  
{ 
	// TODO: Add your control notification handler code here 
	int TempCount; 
	UpdateData(TRUE); //读取编辑框内容 
    if(m_ctrlHexSend.GetCheck()) 
	{ 
		CByteArray hexdata; 
		int len=String2Hex(m_strTXData,hexdata); //此处返回的len可以用于计算发送了多少个十六进制数 
		m_ctrlComm.SetOutput(COleVariant(hexdata)); //发送十六进制数据 
		//更新发送计数 
		TempCount=m_strTXData.GetLength();            //取发送数据长度 
		m_nTxCount+=TempCount;                        //发送计数 
		m_strTxCount.Format("TX:%d",m_nTxCount); 
		UpdateData(FALSE); //更新编辑框内容 
	} 
    else 
	{ 
		m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送ASCII字符数据 
		//更新发送计数 
		TempCount=m_strTXData.GetLength();            //取发送数据长度 
		m_nTxCount+=TempCount;                        //发送计数 
		m_strTxCount.Format("TX:%d",m_nTxCount); 
		UpdateData(FALSE); //更新编辑框内容 
	} 
 
	 
 
} 
 
BEGIN_EVENTSINK_MAP(CComtestDlg, CDialog) 
    //{{AFX_EVENTSINK_MAP(CComtestDlg) 
	ON_EVENT(CComtestDlg, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE) 
	//}}AFX_EVENTSINK_MAP 
END_EVENTSINK_MAP() 
 
void CComtestDlg::OnComm()  
{ 
	// TODO: Add your control notification handler code here 
	VARIANT variant_inp; 
    COleSafeArray safearray_inp; 
    LONG len,k; 
    BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed. 
    CString strtemp; 
    if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符 
    {             ////////以下你可以根据自己的通信协议加入处理代码 
        variant_inp=m_ctrlComm.GetInput(); //读缓冲区 
        safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 
        len=safearray_inp.GetOneDimSize(); //得到有效数据长度 
        for(k=0;k=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 CComtestDlg::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); 
} 
 
void CComtestDlg::OnAutosend()  
{ 
	// TODO: Add your control notification handler code here 
	m_bAutoSend=!m_bAutoSend; 
    if(m_bAutoSend) 
	{   
		UpdateData(TRUE);            //读取对话框内容 
		TRACE("%d\n",m_nSendTime); 
		SetTimer(1,m_nSendTime,NULL);//设置自动发送时间 
	} 
	else 
	{ 
		KillTimer(1);  //取消定时 
	} 
} 
 
//选择串口号 
void CComtestDlg::OnSelchangeSetcom()  
{ 
	// TODO: Add your control notification handler code here 
	if(m_ctrlComm.GetPortOpen()) 
		m_ctrlComm.SetPortOpen(FALSE);       //如果串口打开则关闭串口 
	UpdateData(TRUE);                   //读取串口号 
    m_bCtrlCom=0;                         //串置关闭状态 
	m_ctrlComLed.SetBitmap (m_bmpLedOff); 
	m_strComStatus.Empty(); 
	UpdateData(FALSE); //更新编辑框内容 
 
   // if(m_ctrlComm.GetPortOpen()) 
  //  m_ctrlComm.SetPortOpen(FALSE); 
    m_ctrlComm.SetCommPort(m_nCom+1);     //设置串口       
    if( !m_ctrlComm.GetPortOpen()) 
	{ 
		m_ctrlComm.SetPortOpen(TRUE);         //打开串口 
		m_ctrlComctl.SetWindowText("关闭串口"); 
     	m_bCtrlCom=1;                         //串口置打开状态  
		m_ctrlComLed.SetBitmap (m_bmpLedOn); 
	} 
    else     
	{ 
		m_ctrlComctl.SetWindowText("打开串口"); 
		AfxMessageBox("没有发现串口"); 
	    m_bCtrlCom=0;                         //串置关闭状态 
		m_ctrlComLed.SetBitmap (m_bmpLedOff); 
	     
	} 
	ChangeCom(); 
	m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据 
    m_ctrlComm.SetRThreshold(1);  
    //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件 
    m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0 
    m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据 
} 
 
//选择波特率 
void CComtestDlg::OnSelchangeSetbtl()  
{ 
	// TODO: Add your control notification handler code here 
	ChangeCom();                                      //改变串口状态 
} 
//选择数据位 
void CComtestDlg::OnSelchangeSetsgw()  
{ 
	// TODO: Add your control notification handler code here 
	ChangeCom(); 
} 
//选择停止位 
void CComtestDlg::OnSelchangeSetstopb()  
{ 
	// TODO: Add your control notification handler code here 
    ChangeCom(); 
} 
//选择校验位 
void CComtestDlg::OnSelchangeSetxyw()  
{ 
	// TODO: Add your control notification handler code here 
    ChangeCom(); 
 
} 
//将串口选择列表框内容转换设置串口参数,并设置串口参数据(串口号除外) 
void CComtestDlg::ChangeCom() 
{    
	UpdateData(TRUE);                //读取控位数据 
	switch (m_nBtl)                   
	{ 
	case 0 :  m_nSBtl=300;     break; 
	case 1 :  m_nSBtl=600;     break;     //波特率 
	case 2 :  m_nSBtl=1200;    break; 
	case 3 :  m_nSBtl=2400;    break; 
	case 4 :  m_nSBtl=4800;    break; 
	case 5 :  m_nSBtl=9600;    break;         
	case 6 :  m_nSBtl=19200;   break; 
	case 7 :  m_nSBtl=38400;   break; 
    case 8 :  m_nSBtl=43000;   break; 
	case 9 :  m_nSBtl=56000;   break; 
	case 10:  m_nSBtl=56700;   break; 
    case 11:  m_nSBtl=115200;  break; 
	default:break; 
	} 
    switch(m_nXyw)                      
	{ 
	case 0:m_cSXyw='n';break; 
	case 1:m_cSXyw='o';break;        //校验位 
	case 2:m_cSXyw='e';break; 
	default:break; 
	} 
    switch(m_nSgw)                   
	{ 
	case 0:m_nSSgw=6;break; 
	case 1:m_nSSgw=7;break; 
	case 2:m_nSSgw=8;break;            //数据位 
	default:break; 
	}          
	switch(m_nStopb)                   
	{ 
	case 0:m_nSStopb=1;break; 
	case 1:m_nSStopb=2;break;           //停止位 
	default:break; 
	}    
	CString SettingCom; 
	SettingCom.Format("%d,%c,%d,%d",m_nSBtl,m_cSXyw,m_nSSgw,m_nSStopb); 
    TRACE(SettingCom); 
	m_ctrlComm.SetSettings(SettingCom);    //修改串口参数    
	UpdataStatus();                        //显示串口状态 
} 
//设置自动发送时间 
 
void CComtestDlg::OnUpdateSendtime()  
{ 
if(m_bAutoSend) 
	{   
		UpdateData(TRUE);            //读取对话框内容 
		TRACE("%d\n",m_nSendTime); 
		AfxMessageBox("m_nSendTime"); 
		SetTimer(1,m_nSendTime,NULL);//设置自动发送时间 
	} 
} 
 
void CComtestDlg::OnCtrlCom()             //串口状态控制(打开或关闭串口) 
{ 
	// TODO: Add your control notification handler code here 
	if (m_bCtrlCom) 
	{ 
		m_ctrlComctl.SetWindowText("打开串口"); 
		m_ctrlComm.SetPortOpen(FALSE); 
		m_bCtrlCom=0;                         //串口置关闭状态 
		m_ctrlComLed.SetBitmap (m_bmpLedOff); 
	} 
	else 
	{ 
		m_ctrlComctl.SetWindowText("关闭串口"); 
		m_ctrlComm.SetPortOpen(TRUE); 
		m_bCtrlCom=1;                         //串口置关闭状态 
		m_ctrlComLed.SetBitmap (m_bmpLedOn); 
	}	 
	 UpdataStatus();                  //显示串口状态  
} 
 
 
 
                                         
void CComtestDlg::UpdataStatus()                //更新串口状态显示 
{ 
    if(m_bCtrlCom)                              //判断串口状态(打开或关闭) 
	{ 
		m_strComStatus.Format("状态:COM %d 打开,%6d,%c,%d,%d",m_nCom+1,m_nSBtl,m_cSXyw,m_nSSgw, m_nSStopb); 
	} 
    else 
	{ 
		m_strComStatus.Format("状态:COM %d 关闭,%6d,%c,%d,%d",m_nCom+1,m_nSBtl,m_cSXyw,m_nSSgw, m_nSStopb); 
	} 
    UpdateData(FALSE); //更新编辑框内容 
} 
 
void CComtestDlg::OnRescount()               // 复位计数 
{ 
	// TODO: Add your control notification handler code here 
	m_nTxCount=0;             //发送计数 
	m_nRxCount=0;             //接收计数 
	m_strTxCount.Format("TX:%d",m_nTxCount);        //发送计数显示 
	m_strRxCount.Format("TX:%d",m_nRxCount);        //接收计数显示 
	UpdateData(FALSE);        //更新显示 
} 
 
void CComtestDlg::OnClearrxdata()         //清空接收缓冲区 
{ 
	m_strRXData.Empty(); 
    UpdateData(FALSE);        //更新显示 
} 
 
void CComtestDlg::OnCleartxdata()          //清空发送缓区 
{ 
																			 
	m_strTXData.Empty(); 
    UpdateData(FALSE);        //更新显示 
} 
 
void CComtestDlg::OnOpensendfile()            //打开发送文件 
{ 
	CFileDialog mFileDlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT| 
		         OFN_ALLOWMULTISELECT,"文本文件(*.txt)|*.txt|All Files(*.*)|*.*||",AfxGetMainWnd()); 
	mFileDlg.DoModal (); 
	CString FileName; 
	FileName=mFileDlg.GetPathName(); 
	CStdioFile mFile;  
	CFileException mExcept;  
	if(mFile.Open( FileName, CFile::modeRead, &mExcept)==0) 
	{ 
		return; 
	} 
    m_strRXData.Empty();       //清空接收缓冲区 
    CString strLine; 
    while(mFile.ReadString(strLine)) 
	{ 
		m_strTXData+=strLine; 
        m_strTXData+=0x0d;             //加入换行标志 
		m_strTXData+=0x0d; 
		m_strTXData+=0x0a; 
        
	} 
	mFile.Close(); 
	UpdateData(FALSE);        //更新显示 
	//OnButtonManualsend();     //发送数据 
	     
} 
 
void CComtestDlg::OnSavedata()             //保存接收数据 
{ 
	CFileDialog mFileDlg(FALSE,"txt",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT| 
		         OFN_ALLOWMULTISELECT,"文本文件(*.txt)|*.txt|All Files(*.*)|*.*||",AfxGetMainWnd()); 
	mFileDlg.DoModal (); 
	CString FileName; 
	FileName=mFileDlg.GetPathName(); 
	CStdioFile mFile; 
 
	CFileException mExcept;  
	if(mFile.Open(FileName, CFile::modeCreate|CFile::modeWrite, &mExcept)==0) 
	{ 
		return; 
	} 
	mFile.WriteString(m_strRXData);  
	mFile.Close(); 
} 
 
void CComtestDlg::OnSizing(UINT fwSide, LPRECT pRect)  
{ 
	CDialog::OnSizing(fwSide, pRect); 
	EASYSIZE_MINSIZE(630,500,fwSide,pRect);              //设置最小尺寸 
 
	 
}