VS2005和Win7系统下编写基于控件的MFC串口程序.docx_第1页
VS2005和Win7系统下编写基于控件的MFC串口程序.docx_第2页
VS2005和Win7系统下编写基于控件的MFC串口程序.docx_第3页
VS2005和Win7系统下编写基于控件的MFC串口程序.docx_第4页
VS2005和Win7系统下编写基于控件的MFC串口程序.docx_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VS2005和Win7系统下编写基于控件的MFC串口程序在VS2005中不带串口控件,那么第一步就是去下载或者复制一个mscomm32.ocx文件。如下图所示,将其拷贝到System32目录下,我的是D:WindowsSystem32,如果你的win7系统在C盘,请注意目录位置。第二步:在“开始”-“运行”-输入“regsvr32 mscomm32.ocx”以进行控件注册。第三步:用VS2005建立一个基于MFC对话框的应用程序,工程名叫MFCComm。在资源对话框点鼠标右键,插入ActiveX控件,找到刚才注册成功的控件Microsoft Communications Control,version 6.0.给插入的控件关联一个成员变量m_Comm。点控件-右键-添加变量,如下图所示同时点控件-右键-添加事件处理程序,如下图,点击添加编辑即可。该事件用于接受数据用,生成的代码为void CMFCCommDlg:OnCommMscomm1()。最终设计的Dlg对话框如下,在接受编辑框内关联一个CString的数值变量m_strRecvData.好了,现在开始编写程序,/ MFCCommDlg.h : 头文件/#pragma once#include mscomm1.h/ CMFCCommDlg 对话框class CMFCCommDlg : public CDialog/ 构造public:CMFCCommDlg(CWnd* pParent = NULL);/ 标准构造函数/ 对话框数据enum IDD = IDD_MFCCOMM_DIALOG ;protected:virtual void DoDataExchange(CDataExchange* pDX);/ DDX/DDV 支持/ 实现protected:HICON m_hIcon;/ 生成的消息映射函数virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnTimer(UINT_PTR nIDEvent);afx_msg void OnDestroy();virtual BOOL PreTranslateMessage(MSG* pMsg);DECLARE_MESSAGE_MAP()public:DECLARE_EVENTSINK_MAP()void OnCommMscomm1();afx_msg void OnBnClickedSend();/ 初始化串口void InitSerialPort();int String2Hex(CString str,CByteArray &senddata);char ConvertHexChar(char ch);public:CMscomm1 m_Comm;CString m_strRecvData;/ MFCCommDlg.cpp : 实现文件/#include stdafx.h#include MFCComm.h#include MFCCommDlg.h#ifdef _DEBUG#define new DEBUG_NEW#endif/ 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : public CDialogpublic:CAboutDlg();/ 对话框数据enum IDD = IDD_ABOUTBOX ;protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV 支持/ 实现protected:DECLARE_MESSAGE_MAP();CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)void CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()/ CMFCCommDlg 对话框CMFCCommDlg:CMFCCommDlg(CWnd* pParent /*=NULL*/): CDialog(CMFCCommDlg:IDD, pParent), m_strRecvData(_T()m_hIcon = AfxGetApp()-LoadIcon(IDR_MAINFRAME);void CMFCCommDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);DDX_Control(pDX, IDC_MSCOMM1, m_Comm);DDX_Text(pDX, IDC_EDIT3, m_strRecvData);BEGIN_MESSAGE_MAP(CMFCCommDlg, CDialog)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()/AFX_MSG_MAPON_WM_TIMER()ON_WM_DESTROY()ON_BN_CLICKED(IDC_SEND, &CMFCCommDlg:OnBnClickedSend)END_MESSAGE_MAP()/ CMFCCommDlg 消息处理程序BOOL CMFCCommDlg:OnInitDialog()CDialog:OnInitDialog();/ 将“关于.”菜单项添加到系统菜单中。/ IDM_ABOUTBOX 必须在系统命令范围内。ASSERT(IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动/ 执行此操作SetIcon(m_hIcon, TRUE);/ 设置大图标SetIcon(m_hIcon, FALSE);/ 设置小图标/ TODO: 在此添加额外的初始化代码InitSerialPort();return TRUE; / 除非将焦点设置到控件,否则返回 TRUEvoid CMFCCommDlg:OnSysCommand(UINT nID, LPARAM lParam)if (nID & 0xFFF0) = IDM_ABOUTBOX)CAboutDlg dlgAbout;dlgAbout.DoModal();elseCDialog:OnSysCommand(nID, lParam);/ 如果向对话框添加最小化按钮,则需要下面的代码/ 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,/ 这将由框架自动完成。void CMFCCommDlg:OnPaint()if (IsIconic()CPaintDC dc(this); / 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc(), 0);/ 使图标在工作矩形中居中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;/ 绘制图标dc.DrawIcon(x, y, m_hIcon);elseCDialog:OnPaint();/当用户拖动最小化窗口时系统调用此函数取得光标显示。/HCURSOR CMFCCommDlg:OnQueryDragIcon()return static_cast(m_hIcon);void CMFCCommDlg:OnDestroy()m_Comm.put_PortOpen(FALSE);CDialog:OnDestroy();/ TODO: 在此处添加消息处理程序代码/*- 控制部分-*/void CMFCCommDlg:OnTimer(UINT_PTR nIDEvent)/ TODO: 在此添加消息处理程序代码和/或调用默认值CDialog:OnTimer(nIDEvent);void CMFCCommDlg:OnBnClickedSend()/ TODO: 在此添加控件通知处理程序代码/ 发送指令1:AA 09 20 00 00 00 00 01 02 06 55if (m_Comm.get_PortOpen()CString strInput;GetDlgItem(IDC_EDIT1)-GetWindowText(strInput);/ 将CString转换成十六进制数字CByteArray hexdata;String2Hex(strInput,hexdata);m_Comm.put_Output(COleVariant(hexdata);/发送数据BOOL CMFCCommDlg:PreTranslateMessage(MSG* pMsg)/ TODO: 在此添加专用代码和/或调用基类if(pMsg-message=WM_KEYDOWN)switch (pMsg-wParam)case 48:break;return CDialog:PreTranslateMessage(pMsg);/*- 串口程序相关-*/BEGIN_EVENTSINK_MAP(CMFCCommDlg, CDialog)ON_EVENT(CMFCCommDlg, IDC_MSCOMM1, 1, CMFCCommDlg:OnCommMscomm1, VTS_NONE)END_EVENTSINK_MAP()void CMFCCommDlg:OnCommMscomm1()/串口事件响应函数VARIANT variant_inp;COleSafeArray safearray_inp;LONG len,k;BYTE rxdata2048; /设置BYTE数组 An 8-bit integerthat is not signed.CString strtemp;if(m_Comm.get_CommEvent()=2) /事件值为2表示接收缓冲区内有字符 /以下你可以根据自己的通信协议加入处理代码variant_inp=m_Comm.get_Input(); /读缓冲区safearray_inp=variant_inp; /VARIANT型变量转换为ColeSafeArray型变量,注意m_Comm.put_InputMode(1)设置为二进制,否则会出错len=safearray_inp.GetOneDimSize(); /得到有效数据长度for(k=0;klen;k+)safearray_inp.GetElement(&k,rxdata+k);/转换为BYTE型数组for(k=0;klen;k+) /将数组转换为Cstring型变量BYTE bt=*(char*)(rxdata+k); /字符型strtemp.Format(L%02X ,bt); /将字符以十六进制方式送入临时变量strtemp存放,注意这里加入一个空隔m_strRecvData+=strtemp; /加入接收编辑框对应字符串 UpdateData(FALSE); /更新编辑框内容void CMFCCommDlg:InitSerialPort()/ 如果串口应经打开,先关闭它if (m_Comm.get_PortOpen()m_Comm.put_PortOpen(FALSE);m_Comm.put_CommPort(1);/端口号m_Comm.put_Settings(_T(57600,n,8,1);/波特率、奇偶校验、数据位和停止位m_Comm.put_RThreshold(1);/接收数据的时候,引发接收数据的OnComm事件时缓冲区中的字符数量,1表示每接收到一个字符就触发OnComm事件。m_Comm.put_SThreshold(0);/发送数据的时候,引发接收数据的OnComm事件时缓冲区中的字符数量,0表示不触发OnComm事件m_Comm.put_InputLen(100);/设定当前接收区数据长度为0,表示全部读取。m_Comm.put_InputMode(1);/用来设定数据接收模式,1表示二进制,0表示文本。m_Comm.put_InBufferSize(1024);/接收的缓冲区大小,单位:字节if (!m_Comm.get_PortOpen()/m_Comm.put_PortOpen(false);m_Comm.put_PortOpen(true);elseAfxMessageBox(Lcannot open serial port!);/m_Comm.put_PortOpen(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论