已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VC+串口读写编程方法Visual C+为我们提供了一种好用的ActiveX控件Microsoft Communications Control(即MSComm)来支持应用程序对串口的访问,在应用程序中插入MSComm控件后就可以较为方便地实现对通过计算机串口收发数据。要使用ActiveX控件MSComm,程序员必须将其添加入工程,其方法是:(1)单击主菜单project的子菜单Add To project的Components and Controls选项;(2)在弹出的Components and Controls Gallery对话框中选择Registered ActiveX Controls文件夹中的Microsoft Communications Control,version 6.0选项,如下图:单击其中的Insert按钮,MSComm控件就被增加到工程中了。与此同时,类CMSComm的相关文件mscomm.h和mscomm.cpp也 一并被加入Project的Header Files和Source Files中。当然,程序员可以自己修改文件名。直接分析mscomm.h头文件就可以完备地获取这个控件的使用方法(主要是public类型的接口函数),下面我们摘取了头文件的主要代码并对其关键部分给出了注释:#if !defined(AFX_MSCOMM_H_)#define AFX_MSCOMM_H_ #if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000/ Machine generated IDispatch wrapper class(es) created by Microsoft Visual C+/ NOTE: Do not modify the contents of this file. If this class is regenerated by/ Microsoft Visual C+, your modifications will be overwritten./ CMSComm wrapper classclass CMSComm : public CWndprotected:DECLARE_DYNCREATE(CMSComm)public:CLSID const& GetClsid()static CLSID const clsid = 0x648a5600, 0x2c6e, 0x101b, 0x82, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14 ;return clsid;virtual BOOL Create(LPCTSTR lpszClassName,LPCTSTR lpszWindowName, DWORD dwStyle,const RECT& rect,CWnd* pParentWnd, UINT nID,CCreateContext* pContext = NULL) return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID); BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,const RECT& rect, CWnd* pParentWnd, UINT nID,CFile* pPersist = NULL, BOOL bStorage = FALSE,BSTR bstrLicKey = NULL) return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,pPersist, bStorage, bstrLicKey); / Attributespublic:/ Operationspublic:void SetCDHolding(BOOL bNewValue);BOOL GetCDHolding();void SetCommID(long nNewValue);long GetCommID();void SetCommPort(short nNewValue);/设置端口号,如nNewValue =1表示COM1short GetCommPort();void SetCTSHolding(BOOL bNewValue);BOOL GetCTSHolding();void SetDSRHolding(BOOL bNewValue);BOOL GetDSRHolding();void SetDTREnable(BOOL bNewValue);BOOL GetDTREnable();void SetHandshaking(long nNewValue);long GetHandshaking();void SetInBufferSize(short nNewValue);short GetInBufferSize();void SetInBufferCount(short nNewValue);short GetInBufferCount();void SetBreak(BOOL bNewValue);BOOL GetBreak();void SetInputLen(short nNewValue);short GetInputLen();void SetNullDiscard(BOOL bNewValue);BOOL GetNullDiscard();void SetOutBufferSize(short nNewValue);short GetOutBufferSize();void SetOutBufferCount(short nNewValue);short GetOutBufferCount();void SetParityReplace(LPCTSTR lpszNewValue);CString GetParityReplace();void SetPortOpen(BOOL bNewValue);/打开或关闭串口,TRUE:打开,FALSE:关闭BOOL GetPortOpen();/串口是否已打开,TRUE:打开,FALSE:关闭void SetRThreshold(short nNewValue);/如果设置为1,表示一接收到字符就发送2号事件short GetRThreshold();void SetRTSEnable(BOOL bNewValue);/硬件握手使能?BOOL GetRTSEnable();void SetSettings(LPCTSTR lpszNewValue);/Settings由4部分组成,其格式为:BBBB,P,D,S,即波特率,是否奇偶校验,数据位 /个数,停止位,如设置为:9600,n,8,1CString GetSettings();void SetSThreshold(short nNewValue); /如果保持缺省值0不变,则表示发送数据的过程中串口上不发生事件short GetSThreshold();void SetOutput(const VARIANT& newValue);/一个非常重要的函数,用于写串口,注意其接收的输入参数为VARIANT类型对象, /我们需要将字符串转化为VARIANT类型对象VARIANT GetOutput();void SetInput(const VARIANT& newValue);VARIANT GetInput();/一个非常重要的函数,用于读串口,注意其返回的是VARIANT类型对象,我们需要/将其转化为字符串void SetCommEvent(short nNewValue);short GetCommEvent();/一个非常重要的函数,获得串口上刚发生的事件(事件可以理解为软件意义上的/消息或硬件意义上的中断),事件的发送会导致OnComm消息的诞生!void SetEOFEnable(BOOL bNewValue);BOOL GetEOFEnable();void SetInputMode(long nNewValue);long GetInputMode();/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the previous line.#endif分析上述源代码可知,基本上,MSComm的诸多接口可以分为如下几类:(1)打开与设置串口接口函数;(2)获得串口设置和串口状态接口函数;(3)设置串口发送数据方式、缓冲区接口及发送数据接口函数;(4)设置串口接收数据方式、缓冲区接口及接收数据接口函数;(5)设置与获取串口上发生的事件接口函数为了使用控件,我们将控件拖入对话框内任意一个位置(运行时电话图标会隐藏),其操作如下图:我们可以直接右键单击这个电话,来设置串口的属性,如下图:接着,我们需要为控件添加一个对应的成员变量m_mscom,其对应的变量类型为CMSComm,如下图:这样就建立了m_mscom和IDC_MSCOMM1控件的相互映射: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同时,在对话框的头文件也会由MFC类向导自动定义CSerialPortActivexDlg类的CMSComm型成员变量m_mscom:CMSComm m_mscom;在对话框初始化时(即在CSerialPortActivexDlg:OnInitDialog函数中)打开串口1:BOOL CSerialPortActivexDlg: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 AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);/ Set the icon for this dialog. The framework does this automatically/ when the applications main window is not a dialogSetIcon(m_hIcon, TRUE); / Set big iconSetIcon(m_hIcon, FALSE); / Set small icon/ TODO: Add extra initialization herem_mscom.SetCommPort(1); /串口1m_mscom.SetInBufferSize(1024); /设置输入缓冲区的大小,Bytes m_mscom.SetOutBufferSize(512); /设置输入缓冲区的大小,Bytes if(!m_mscom.GetPortOpen() /打开串口m_mscom.SetPortOpen(true); m_mscom.SetInputMode(1); /设置输入方式为二进制方式 m_mscom.SetSettings(9600,n,8,1); /设置波特率等参数 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 hereUpdateData(true);CByteArray sendArr; WORD wLength;wLength = m_send.GetLength();sendArr.SetSize(wLength);for(int i =0; iwLength; i+)sendArr.SetAt(i, m_send.GetAt(i);m_mscom.SetOutput(COleVariant(sendArr);为了处理接收事件,我们需要为MScomm控件添加对应的消息处理函数。如下图,我们通过MFC类向导添加了CSerialPortActivexDlg 类的成员函数OnCommMscomm1():这样,在对话框的头文件中就会自动增加下面两句:afx_msg void OnCommMscomm1();/函数声明DECLARE_EVENTSINK_MAP()同时在对话框的.cpp文件中会增加下列代码实现串口消息映射:BEGIN_EVENTSINK_MAP(CSerialPortActivexDlg, CDialog)/AFX_EVENTSINK_MAP(CSerialPortActivexDlg)ON_EVENT(CSeri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB/T 113.3-2026地震预警信息发布第3部分:地震预警专用终端
- 2026事业单位工勤技能-江西-江西工程测量工二级(技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-江苏-江苏食品检验工四级(中级工)历年参考题库含答案详解3套试卷
- 免疫性疾病患儿的护理
- 盆底康复科普讲座
- 妊娠剧的护理查房
- 2016手术室护理论文
- 2026年数字农业技术应用 气象站赋能温室参数动态管理
- 电工安全操作感悟讲解
- 物联网专业就业前景解析
- 2026年司法所调解员业务综合考试题及答案
- 住院期间病人发热处置流程发热患者应急预案
- 2026广东江门市台山博达企业管理有限公司招聘8人笔试备考试题及答案详解
- 2026人教版三年级上册数学暑假预习每日一练(30天)
- 2026版抖音视频号直播带货全流程SOP
- 人工智能赋能高等教育课程教学改革探索与实践
- 2026年甘肃省中考道德与法治试卷(含答案及解析)
- 人形机器人与具身智能标准体系2026版标准化组织运作模式解读
- 江苏省无锡市2025-2026学年四年级下学期6月数学期末调研试题(试卷+答案)
- 2026年医师定期考核中医试题(附答案)
- 20000吨溴化物系列及15000吨溴素及6000吨溴代烷类产品生产加工项目(一期)环境影响报告书
评论
0/150
提交评论