串口通信教程(2)

2019-08-01 22:54

void CSerialPortActivexDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSerialPortActivexDlg) DDX_Text(pDX, IDC_RECV_EDIT, m_recv); DDX_Text(pDX, IDC_SEND_EDIT, m_send); DDX_Control(pDX, IDC_MSCOMM1, m_mscom); //}}AFX_DATA_MAP }

同时,在对话框的头文件也会由\类向导\自动定义CSerialPortActivexDlg类的CMSComm型成员

变量m_mscom: CMSComm m_mscom;

在对话框初始化时(即在CSerialPortActivexDlg::OnInitDialog函数中)打开串口1:

BOOL CSerialPortActivexDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add \ // 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 m_mscom.SetCommPort(1); //串口1 m_mscom.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes m_mscom.SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes if(!m_mscom.GetPortOpen()) //打开串口 { m_mscom.SetPortOpen(true); } m_mscom.SetInputMode(1); //设置输入方式为二进制方式 m_mscom.SetSettings(\设置波特率等参数 m_mscom.SetRThreshold(1); //为1表示有一个字符即引发事件 m_mscom.SetInputLen(0); return TRUE; // return TRUE unless you set the focus to a control }

最核心的发送串口数据函数(\发送\按钮单击事件)如下:

void CSerialPortActivexDlg::OnSendButton() { // TODO: Add your control notification handler code here UpdateData(true); CByteArray sendArr; WORD wLength; wLength = m_send.GetLength(); sendArr.SetSize(wLength); for(int i =0; i

为了处理接收事件,我们需要为MScomm控件添加对应的消息处理函数。如下图,我们通过\类

向导\添加了CSerialPortActivexDlg 类的成员函数OnCommMscomm1():

这样,在对话框的头文件中就会自动增加下面两句:

afx_msg void OnCommMscomm1();//函数声明 DECLARE_EVENTSINK_MAP()

来自AFX_MSG部分: // Generated message map functions //{{AFX_MSG(CSerialPortActivexDlg) virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); afx_msg void OnClearButton(); afx_msg void OnSendButton(); afx_msg void OnCommMscomm1(); DECLARE_EVENTSINK_MAP() //}}AFX_MSG

同时在对话框的.cpp文件中会增加下列代码实现串口消息映射:

BEGIN_EVENTSINK_MAP(CSerialPortActivexDlg, CDialog) //{{AFX_EVENTSINK_MAP(CSerialPortActivexDlg) ON_EVENT(CSerialPortActivexDlg, IDC_MSCOMM1, 1 /* OnComm */, OnCommMscomm1, VTS_NONE) //}}AFX_EVENTSINK_MAP END_EVENTSINK_MAP()

我们定义CSerialPortActivexDlg::OnCommMscomm1()函数主要处理数据的接收,其源代码为:

void CSerialPortActivexDlg::OnCommMscomm1() { // TODO: Add your control notification handler code here UpdateData(true); VARIANT variant_inp; COleSafeArray safearray_inp; long i = 0; int len; char rxdata[1000]; CString tmp; switch (m_mscom.GetCommEvent()) { case 2: //表示接收缓冲区内有字符 { variant_inp = m_mscom.GetInput(); safearray_inp = variant_inp; len = safearray_inp.GetOneDimSize(); for (i = 0; i < len; i++) { safearray_inp.GetElement(&i, &rxdata[i]); } rxdata[i] = '\\0'; } m_recv += rxdata; UpdateData(false); break; default: break; } }

最后,与连载三类似,再次借助\串口调试助手\以实例验证了本程序的正确性,如下图:

最后,需要特别提示的是:如果要在基于\文档/视图\的框架结构程序而非对话框程序中使用串口控件,

我们不能轻松地使用\类向导\,这时候必须手动地添加相关代码。

在MainFrm.h头文件中加入: afx_msg void OnCommMscomm(); DECLARE_EVENTSINK_MAP()

并定义CMSComm成员变量:

CMSComm m_ComPort;

在MainFrm.cpp文件中添加

BEGIN_EVENTSINK_MAP(CMainFrame, CFrameWnd) ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE) //映射ACTIVEX控件的事件 END_EVENTSINK_MAP()

在MainFrm.cpp文件的OnCreate(LPCREATESTRUCT lpCreateStruct)函数中添加: ComPort.Create(NULL, WS_VISIBLE | WS_CHILD, CRect(0,0,0,0),this, ID_COMMCTRL);

以创建CMSComm控件。

此后,我们就可以在CMainFrame类的函数中使用串口控件对应的ComPort控件成员变量。


串口通信教程(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:Spring试题和答案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: