⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scommdlg.cpp

📁 CSerialPort类做的串口通信编程
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// SCOMMDlg.cpp : implementation file
//

#include "stdafx.h"
#include "SCOMM.h"
#include "SCOMMDlg.h"
#include "io.h"    //调用access() 函数
#include "math.h"


/*#using <mscorlib.dll>
#include <tchar.h>
using namespace System;*/


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define BufSize 512

#define Debug1xxx
#define Debug2xxx
#define Debug3xxx
#define Debug4xxx
#define Debug5
#define Debug6
#define Debug7
#define Debug8xxx

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About


class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	CHyperLink	m_ctrlHyperLinkWWWXFS;
	CHyperLink	m_ctrlHyperLink1;
	CStatic m_ctrlVer;
	//}}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)
	virtual BOOL OnInitDialog();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedOk();
};


CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}


void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	DDX_Control(pDX, IDC_STATIC_WWWXFS, m_ctrlHyperLinkWWWXFS);
	DDX_Control(pDX, IDC_STATIC_MAILXFS1, m_ctrlHyperLink1);
	DDX_Control(pDX, IDC_STATIC_VER, m_ctrlVer);
	//}}AFX_DATA_MAP
}

BOOL CAboutDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	CWnd *pWnd = this;//AfxGetMainWnd();
	CTime CurrentTime = CTime::GetCurrentTime();
	CString str, str1;
	str.Empty();
	str1.Empty();
	str1 = CurrentTime.Format("%Y年%m月%d日");
	str = "串口调试助手\nSComAssistant For WIN9X/2000/XP 2007/07/27 ";
	str += str1;

	pWnd->SetWindowText("关于 - 串口调试助手");
	m_ctrlVer.SetWindowText(str);

	//作者邮箱处理: 超链接
	m_ctrlHyperLink1.SetURL(_T("mailto:beauty-na2002@163.com"));
	m_ctrlHyperLink1.SetUnderline(TRUE);
	m_ctrlHyperLink1.SetLinkCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_HAND));
	
	//主页设置: 超链接
	m_ctrlHyperLinkWWWXFS.SetURL(_T("http://www.gjwtech.com"));
	m_ctrlHyperLinkWWWXFS.SetUnderline(TRUE);
	m_ctrlHyperLinkWWWXFS.SetLinkCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_HAND));
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
	//}}AFX_MSG_MAP
	ON_BN_CLICKED(IDOK, &CAboutDlg::OnBnClickedOk)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSCOMMDlg dialog

//构造函数
CSCOMMDlg::CSCOMMDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSCOMMDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSCOMMDlg)
	m_ReceiveData = _T("");
	m_strSendData = _T("");
	m_strCurPath = _T("");
	m_strSendFilePathName = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	m_bAutoSend=FALSE;   //自动发送标志, 0不自动发送, 1自动发送
	m_bVisible=FALSE;
	m_bSendFile=FALSE;
	m_bStopDispRXData = FALSE;  //停止显示数据标志 0不停止1停止
	m_bOpenPort=FALSE;   //m_bOpenPort 串口状态 1关0开
	m_nCycleTime=1000;
	m_strCurPath = "C:\\COMDATA";
	m_strSendFilePathName="还没有选择文件";//"No File Selected!";
	m_nFileLength=0;

}


void CSCOMMDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSCOMMDlg)
	DDX_Control(pDX, IDC_BUTTON_HELP,       m_ctrlHelp);
	DDX_Control(pDX, IDC_BUTTON_PUSHPIN,    m_ctrlPushPin);
	DDX_Control(pDX, IDC_BUTTON_SENDFILE,   m_ctrlSendFile);
	DDX_Control(pDX, IDC_EDIT_SENDFILE,     m_ctrlEditSendFile);
	DDX_Control(pDX, IDC_STATIC_TXCOUNT,    m_ctrlTXCount);     //串口发送计数  静态文本 控制变量
	DDX_Control(pDX, IDC_STATIC_STATUS,     m_ctrlPortStatus);
	DDX_Control(pDX, IDC_STATIC_RXCOUNT,    m_ctrlRXCOUNT);     //串口接收计数  静态文本 控制变量
	DDX_Control(pDX, IDC_EDIT_SAVEPATH,     m_ctrlSavePath);    //保存窗口当前数据 编辑框控制变量
	DDX_Control(pDX, IDC_BUTTON_MANUALSEND, m_ctrlManualSend);
	DDX_Control(pDX, IDC_STATIC_GJW, m_ctrlHyperLink2);         //"MAIL"  静态文本 控制变量
	DDX_Control(pDX, IDC_STATIC_XFS2, m_ctrlHyperLinkWWW);      //"WEB"   静态文本 控制变量
	DDX_Control(pDX, IDC_BUTTON_CLEARRECASENDA, m_ctrlClearTXData);
	DDX_Control(pDX, IDC_STATIC_XFS, m_ctrlStaticXFS);
	DDX_Control(pDX, IDC_BUTTON_CLOSE, m_ctrlClose);
	DDX_Control(pDX, IDC_BUTTON_COUNTRESET, m_ctrlCounterReset);
	DDX_Control(pDX, IDC_EDIT_SEND, m_ctrlEditSend);
	DDX_Control(pDX, IDC_EDIT_RECIVE,  m_ctrlReceiveData);    //接收数据 编辑框 控制变量
	DDX_Control(pDX, IDC_CHECK_AUTOCLEAR, m_ctrlAutoClear);
	DDX_Control(pDX, IDC_STATIC_OPENOFF, m_ctrlIconOpenoff);
	DDX_Control(pDX, IDC_COMBO_STOPBITS, m_StopBits);
	DDX_Control(pDX, IDC_COMBO_DATABITS, m_DataBits);
	DDX_Control(pDX, IDC_COMBO_PARITY, m_Parity);
	DDX_Control(pDX, IDC_CHECK_AUTOSEND, m_ctrlAutoSend);
	DDX_Control(pDX, IDC_CHECK_HEXSEND,  m_ctrlHexSend);
	DDX_Control(pDX, IDC_BUTTON_STOPDISP, m_ctrlStopDisp);
	DDX_Control(pDX, IDC_BUTTON_OPENPORT, m_ctrlOpenPort);
	DDX_Control(pDX, IDC_CHECK_HEXRECIEVE, m_ctrlHexReceieve);
	DDX_Control(pDX, IDC_COMBO_SPEED, m_Speed);
	DDX_Control(pDX, IDC_COMBO_COMSELECT, m_Com);
	DDX_Control(pDX, IDC_BUTTON_SAVEDATA, m_ctrlSaveData);
	DDX_Control(pDX, IDC_STATIC_TIME, m_ctrltime);       //时间显示 静态文本 控制变量

	DDX_Text(pDX, IDC_EDIT_RECIVE, m_ReceiveData);    //接收数据 编辑框 成员变量
	DDX_Text(pDX, IDC_EDIT_SEND,   m_strSendData);
	DDX_Text(pDX, IDC_EDIT_SAVEPATH, m_strCurPath);   //保存窗口当前数据 编辑框成员变量
	DDX_Text(pDX, IDC_EDIT_CYCLETIME, m_strCycleTime);

	DDV_MaxChars(pDX, m_strCurPath, 200);
	DDX_Text(pDX, IDC_EDIT_SENDFILE, m_strSendFilePathName);
	DDV_MaxChars(pDX, m_strSendFilePathName, 200);
	//}}AFX_DATA_MAP
}

//消息映射宏
BEGIN_MESSAGE_MAP(CSCOMMDlg, CDialog)
	//{{AFX_MSG_MAP(CSCOMMDlg)
	ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication)    //在实现文件中添加消息映射宏   从串口接收字符处理函数
	ON_MESSAGE(WM_COMM_TXEMPTY_DETECTED, OnFileSendingEnded)   //检测文件是否发送完毕
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_DESTROY()     //关闭程序时, 调用, 释放占用资源
	ON_WM_TIMER()       //定时器
	
	/*ON_CBN_SELENDOK*/ON_CBN_SELCHANGE(IDC_COMBO_COMSELECT, OnSelendokComboComselect)   //"选择串口" 组合框
	/*ON_CBN_SELENDOK*/ON_CBN_SELCHANGE(IDC_COMBO_SPEED, OnSelendokComboSpeed)           //"选择波特率" 组合框
	/*ON_CBN_SELENDOK*/ON_CBN_SELCHANGE(IDC_COMBO_PARITY, OnSelendokComboParity)         //"校验方式" 组合框
	/*ON_CBN_SELENDOK*/ON_CBN_SELCHANGE(IDC_COMBO_DATABITS, OnSelendokComboDatabits)     //"数据位" 组合框
	/*ON_CBN_SELENDOK*/ON_CBN_SELCHANGE(IDC_COMBO_STOPBITS, OnSelendokComboStopbits)     //"停止位" 组合框

	ON_BN_CLICKED(IDC_BUTTON_OPENPORT, OnButtonOpenport)              //"串口的打开和关闭" 按键按钮	
	ON_BN_CLICKED(IDC_BUTTON_CLEAR_RECI_AREA, OnButtonClearReciArea)  //"清空接收区" 按键按钮
	ON_BN_CLICKED(IDC_BUTTON_STOPDISP, OnButtonStopdisp)              //"停止显示"  按键按钮
		
	ON_BN_CLICKED(IDC_BUTTON_SAVEDATA, OnButtonSavedata)              //"保存显示数据" 按键按钮
	ON_BN_CLICKED(IDC_BUTTON_DIRBROWSER, OnButtonDirbrowser)          //"更改路径"   按键按钮

	ON_BN_CLICKED(IDC_BUTTON_MANUALSEND, OnButtonManualsend)          //"手动发送" 按键按钮
	ON_BN_CLICKED(IDC_CHECK_AUTOSEND, OnCheckAutosend)                //"自动发送" 普通复选框
	ON_EN_CHANGE(IDC_EDIT_CYCLETIME, OnChangeEditCycletime)           //"自动发送周期" 编辑框, 内容改变时, 调用此函数
	ON_EN_CHANGE(IDC_EDIT_SEND, OnChangeEditSend)                     //"发送编辑框" 编辑框, 内容改变时, 调用此函数
	ON_EN_CHANGE(IDC_EDIT_SAVEPATH, OnChangeEditSavepath)
	ON_BN_CLICKED(IDC_BUTTON_CLEARRECASENDA, OnButtonClearrecasenda)  //"清空重填发送区" 按键按钮

	ON_BN_CLICKED(IDC_BUTTON_SENDFILE, OnButtonSendfile)           //"发送文件"   按键按钮
	ON_BN_CLICKED(IDC_BUTTON_FILEBROWSER, OnButtonFilebrowser)     //选择发送文件 按键按钮
	ON_BN_CLICKED(IDC_BUTTON_COUNTRESET, OnButtonCountreset)       //"计数清零"   按键按钮
	ON_BN_CLICKED(IDC_BUTTON_CLOSE, OnButtonClose)                 //"关闭程序"   按键按钮
	ON_BN_CLICKED(IDC_BUTTON_PUSHPIN, OnButtonPushpin)             //"设置置顶"   按键按钮
	ON_BN_CLICKED(IDC_BUTTON_HELP, OnButtonHelp)                   //"帮助"       按键按钮
	//}}AFX_MSG_MAP
	ON_WM_CLOSE()
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSCOMMDlg message handlers

BOOL CSCOMMDlg::OnInitDialog()
{
	//CDialog::OnInitDialog();
	//BOOL b = CDialog::OnInitDialog(0,fdAll,true); 
    BOOL b = 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
	
	//设置标题栏文字(设置标题)
	CString str, str1;
	str.Empty();
	str1.Empty();

	str = "串口调试助手 SComAssistant For WIN9X/2000/XP 2007/07/27 ";

	CTime CurrentTime = CTime::GetCurrentTime();
	str1 = CurrentTime.Format("%Y年%m月%d日");
	
	str += str1;
	
	CWnd *pWnd = AfxGetMainWnd();
	pWnd->SetWindowText(str);

	//显示时间 静态文本
	SetTimer(5, 1000, NULL);
	
	//"MAIL"  设置 超链接
	m_ctrlHyperLink2.SetURL(_T("mailto:beauty-na2002@163.com"));   //mail地址设置
	m_ctrlHyperLink2.SetUnderline(TRUE);     //下划线
	m_ctrlHyperLink2.SetLinkCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_HAND));   //鼠标形状设置

	//"WEB"   设置 超链接  链接到http://www.gjwtech.com
	m_ctrlHyperLinkWWW.SetURL(_T("http://www.gjwtech.com"));   //网址设置
	m_ctrlHyperLinkWWW.SetUnderline(TRUE);                     //下划线
	m_ctrlHyperLinkWWW.SetLinkCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_HAND));    //鼠标形状设置

	//串口接收计数,串口发送计数 初始化显示
	m_ctrlRXCOUNT.SetWindowText("接收:0");
	m_ctrlTXCount.SetWindowText("发送:0");

	/*CWnd *pWnd;
	pWnd = AfxGetMainWnd();
	pWnd->SetWindowText("我的自定义标题栏");*/


/////////////////////////////////////////////////////////////////////
	//设置组合框 初始显示的索引项
	CString pCom[] = {"COM1", "COM2", "COM3", "COM4"};
	int pBaudRate[]={300,600,1200,2400,4800,9600,19200,38400,56000,57600,115200};
	CString Parity[]={_T("None"),_T("Odd"),_T("Even"),_T("Mark"),_T("Space")};
	int pDataBits[]={8, 7, 6};
	int pStopBits[]={1,2};
	int i;

	//选择串口 组合框初始化
	for (i=0; i<4; i++)
	{
		m_Com.AddString(pCom[i]);
	}
	m_Com.SetCurSel(0);

	//设置波特率 组合框初始化
	for (i=0; i<sizeof(pBaudRate)/sizeof(int); i++)
	{
		str.Empty();
		str.Format("%d", pBaudRate[i]);
		m_Speed.AddString(str);
	}
	m_Speed.SetCurSel(5);

	//设置校验位 组合框初始化
	for (i=0; i<5; i++)
	{
		m_Parity.AddString(Parity[i]);
	}
	m_Parity.SetCurSel(0);

	//设置数据位 组合框初始化
	for (i=0; i<3; i++)
	{
		str.Empty();
		str.Format("%d", pDataBits[i]);
		m_DataBits.AddString(str);
	}
	m_DataBits.SetCurSel(0);

	//设置停止位 组合框初始化
	for (i=0; i<2; i++)
	{
		str.Empty();
		str.Format("%d", pStopBits[i]);
		m_StopBits.AddString(str);
	}
	m_StopBits.SetCurSel(0);

/////////////////////////////////////////////////////////////////////
	
	//串口打开的标志
	m_hIconRed  = AfxGetApp()->LoadIcon(IDI_ICON_RED);
	//串口关闭的标志
	m_hIconOff	= AfxGetApp()->LoadIcon(IDI_ICON_OFF);
	m_hIconGreen= AfxGetApp()->LoadIcon(IDI_ICON_GREEN);

//	m_ctrlIconDatareceive.SetIcon(m_hIconOff);

	m_nBaud=9600;
	m_nCom=1;
	m_cParity='N';
	m_nDatabits=8;
	m_nStopbits=1;
	m_dwCommEvents = EV_RXFLAG | EV_RXCHAR;
	
	CString strStatus;

	BOOL ret;
	//串口初始化
	ret = m_Port.InitPort(this, m_nCom, m_nBaud, m_cParity, m_nDatabits, m_nStopbits, m_dwCommEvents, 512);
	if (ret)   //返回TRUE, 成功
	{
		//启动串口通信检测线程函数
		m_Port.StartMonitoring();
		
		strStatus.Empty();
		strStatus.Format("当前状态: COM%d已打开,%dbps,%c,%d,%d", m_nCom, m_nBaud, m_cParity, m_nDatabits, m_nStopbits);
		m_ctrlIconOpenoff.SetIcon(m_hIconRed);

		//当前状态:串口打开,无奇偶校验,8数据位,1停止位.
		//状态栏(自己做的一个静态文本)
		m_ctrlPortStatus.SetWindowText(strStatus);
	}
	else    //返回FALSE, 失败
	{
		AfxMessageBox("串口被占用或没有发现此串口");
		m_ctrlIconOpenoff.SetIcon(m_hIconOff);
		
		strStatus.Empty();
		strStatus.Format("串口被占用或没有发现此串口");
		//状态栏(自己做的一个静态文本)
		m_ctrlPortStatus.SetWindowText(strStatus);
	}

	//获取"自动发送周期"编辑框的句柄
	CEdit* pEdit=(CEdit*)GetDlgItem(IDC_EDIT_CYCLETIME);
	
	CString strText;
	strText.Empty();
	strText.Format("%d",m_nCycleTime);   //在对话框建立时, 调用构造函数,已经初始化为1000
	pEdit->SetWindowText(strText);   //显示设置的发送周期时间(ms)

	m_strSendData = "http://www.gjwtech.com";
	//char cr=13,lf=10;
	//m_strSendData += cr;
	//m_strSendData += lf;

	//设置"自动清空" 单选按钮的状态 1选中, 0不选中
	m_ctrlAutoClear.SetCheck(1);
	
	//设置 发送文件后的"文件名编辑框(只读)" 内容
	//m_ctrlEditSendFile.SetWindowText("No File Selected!");

	//动画图标 (不明白?!)
	m_animIcon.SetImageList(IDB_ANIM_IMGLIST, 4, RGB(0,0,0));
	SetTimer(4,200,NULL);

	//将成员变量的值传给对应的控件, 并显示
	UpdateData(FALSE);


	ShowWindow(SW_SHOW);   //这句也不知道是干什么的?!
//	return TRUE;  // return TRUE  unless you set the focus to a control
	return b;
}

void CSCOMMDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	//if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	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 CSCOMMDlg::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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -