串口编程 详解1
最近在一个小应用中要用到串口接收和发送数据。所以就参考一书整了个串口调试助手练练手(结果如下图,不是很美观,有些控件是可以更换成更合理的控件的)
1、建立基于对话框的工程SCOMM(Serial communication)。
2、在对话框中添加控件并设置控件属性
3、添加类文件(这里主要是指CSerialPort类,包括:SerialPort.h和SerialPort.cpp文件,在两文件在下一博文专门给出)。在SCOMMDlg.h中使用#include“SerialPort.h”包含进CSerialPort类。
4、完成串口消息处理函数OnCommunication.
添加WM_COMM_RXCHAR消息,这个消息的添加本以为可以用向导,可是不行,得手动。//在SCOMMDlg.h : header file中添加响应函数。
//{{AFX_MSG(CSCOMMDlg)
afx_msg LONG OnCommunication(WPARAM ch,LPARAM port);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
在// SCOMMDlg.cpp : implementation file中添加WM_COMM_RXCHAR消息映射
//消息映射
BEGIN_MESSAGE_MAP(CSCOMMDlg, CDialog)
//{{AFX_MSG_MAP(CSCOMMDlg)
ON_MESSAGE(WM_COMM_RXCHAR,OnCommunication)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
在// SCOMMDlg.cpp : implementation file中添加OnCommunication( )实现函数如下:(怎不添加代码)
LONG CSCOMMDlg::OnCommunication(WPARAM ch,LPARAM port)
{
return 0;
}
在完成串口消息处理函数OnCommunication中,我们是可以看到MFC的映射机制的:
首先,在头文件中声明消息响应函数afx_msg 函数返回类型 函数名
其次,在实现文件添加消息映射(说白了,就 是 来了 某种消息 则 应该执行某对应的函数以实现某个动作)
如ON_MESSAGE(WM_COMM_RXCHAR,OnCommunication), 表如果来了WM_COMM_RXCHAR这个消息,则去执行OnCommunication这个函数
又如ON_BN_CLICKED(IDC_BUTTON_OPENPORT, OnButtonOpenport),表来了单击“打开串口”这个按钮时就会来个IDC_BUTTON_OPENPORT消息,这个消息来了之后就去执行OnButtonOpenport函数。
最后,刚才说到消息对应到函数,这里就得把刚才那个函数实现了。如LONG CSCOMMDlg::OnCommunication(WPARAM ch,LPARAM port){ return 0; }
补充一点:刚才在说到的:在对话框中添加控件并设置控件属性,这个过程是不仅涉及到消息映射问题。还是涉及到数据的映射。
如刚才的提到的“打开串口”按钮
下面是是把IDC_BUTTON_OPENPORT这个ID和m_ctrlOpenPort变量映射起来
void CSCOMMDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//数据映射(按钮、编辑框 与 变量的映射)
//{{AFX_DATA_MAP(CSCOMMDlg)
DDX_Control(pDX, IDC_BUTTON_OPENPORT, m_ctrlOpenPort);
//}}AFX_DATA_MAP
}
下面是把单击IDC_BUTTON_OPENPORT这个消息和OnButtonOpenport映射起来。
//消息映射
BEGIN_MESSAGE_MAP(CSCOMMDlg, CDialog)
//{{AFX_MSG_MAP(CSCOMMDlg)
ON_MESSAGE(WM_COMM_RXCHAR,OnCommunication)
ON_BN_CLICKED(IDC_BUTTON_OPENPORT, OnButtonOpenport)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()