




免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
MSComm控件参考MSComm是Microsoft Communications Control的简称,它是Microsoft公司提供的简化Windows下串口编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。(一)MSComm控件的属性MSComm控件有很多重要的属性,但首先必须熟悉几个属性:CommPort设置并返回通信端口号;Settings以字符串的形式设置并返回数据传输速率、奇偶校验、数据比特、停止比特;PortOpen设置并返回通信端口的状态,也可以打开和关闭端口;Input从接收缓冲区返回和删除字符;Output向传输缓冲区写一个字符串。下面分别描述MSComm控件的属性。(1) CommPort属性void SetCommPort(short nNew Value);short GetCommPort();这一属性用于设置并返回连接的串行端口号,Windows将会利用该串口和外界通信。在设计时,nNewValue 可以设置成从116的任何数(默认值为1)。但是如果用PortOpen属性打开一个并不存在的端口时,MSComm控件会产生错误68(设备无效)。注意:必须在打开端口之前设置CommPort属性。(2) Settings属性void Settings(LPCSTR IpszNewValue); String GetSettings();该属性用于设置并返回数据传输速率、奇偶校验、数据比特、停止比特参数。当端口打开时,如果value非法,则MSComm控件产生错误380(非法属性值)。其中IpszNewValue用字符串表示,由四个设置值组成,有如下的组成格式: “BBBB,P,D,S” 这里BBBB为数据传输速率,P为奇偶校验,D为数据比特数,S为停止比特数。value的默认值是:“9600,N,8,1”,表示传输速率为9600bit/s,无奇偶校验,8bit数据比特,1bit停止比特。数据传输速率的合法值可以是:110、300、600、1200、2400、4800、9600、14 400、19 200、28 800、38 400、56 000、57 600、115 200、12 800、25 600。 奇偶校验值可以设置为表1的任一值。表1: 奇偶校验设定值 设定值 描述E偶校验(EVENT)M标号校验(MARK)N无效验(NONE)O奇校验(ODD)S空格校验(SPACE)数据比特数可以是4、5、6、7、8。 停止比特数可以是1、1.5、2。注意:只有当通信的双方的Settings属性值都一样,通信连接才能生效。(3) Handshaking属性这一属性用于设置或者返回硬件握手协议,也就是PC机和通信设备之间为了控制流速而设定的内部协议。属性值可以设置为表2中的任一个。表2:硬件握手协议设定值 设定值 值 描述 ComNone 0 默认值,无握手协议 comXonXOff 1 XON/XOFF握手 ComRTS 2Request-To-Send/Clear-To-Send握手 comRtsXonXoff 3Request-To-Send/Clear-To-Send握手皆可(4) RThreshold属性void SetRThreshold(short nNew Value); short GetRThreshold()在MSComm控件设置CommEvent属性为comEvReceive并产生OnComm之前,RThreshold属性设置并返回的要接收的字符数。这里nNewValue是short型参数,说明在产生OnComm事件之前要接收的字符数。当接收字符后,若RThreshold属性设置为0(默认值)则不产生OnComm事件。否则,该属性为一阈值,当接收缓冲区那字节个数达到或超过该值后就会产生OnComm事件,例如,设置RThreshold为1,接收缓冲区收到每一个字符都会使MSComm控件产生OnComm事件。(4) CTSHolding属性void SetCTSHolding(BOOL bNewValue); BOOL GetCTSHolding();其属性设定值见表3。表3: CTSHolding属性设定值 设定值 功能描述TRUEClear To Send线为 高电平FALSEClear To Send线为 低电平该属性确定是否可通过查询Clear To Send(CTS)线的状态发送数据。Clear To Send是调制解调器发送到相联计算机的信号,指示传输可以进行。该属性在设计时无效,在运行时为只读。如果Clear To Send线为 低电平(CTSHoldingFALSE)并且超时时,MSComm控件设置CommEvent属性为comEventCTSTO(Clear To Send Timeout)并产生OnComm事件。Clear To Send线用于RTS/CTS(Request To Send)硬件握手。如果需要确定Clear To Send线的状态,CTSHolding属性给出一种手工查询的方法。(5) SThreshold属性void SetSThreshold(short nNewValue); short GetSThreshold();MSComm控件设置CommEvent属性为comEvSend并产生OnComm事件之前,设置并返回传输缓冲区中允许的最小字符数。这里nNewvalue是short型数据,代表在OnComm事件产生之前在传输缓冲区中的最小字符数。若设置SThreshold属性为0(默认值),数据传输事件不会产生OnComm事件。若设置SThreshold属性为1,当传输缓冲区完全空时,MSComm控件产生OnComm事件。如果在传输缓冲区的字符数小于Value,CommEvent属性设置为comEvSend, 并产生OnComm事件。comEvSend事件仅当字符数与SThreshold交叉时被激活一次。例如,如果SThreshold等于5,仅当在输出队列中字符数从5降到4时,comEvSend才发生。如果在输出队列中从没有比SThreshold多的字符,comEvSend事件将绝不会发生。 (6) InputMode属性 void SetInputMode(long nNewValue); long GetInputMode();该属性用于设置或者返回传输数据的类型。其取值和基本含义如表4所示。表4: InputMode属性及含义 设定值 值 描述ComInputModeText(缺省) 0通过Input属性以文本方式取回数据comInputModeBinary 1通过Input属性以二进制方式检取回数据(7) InPutLen属性void SetInPutLen(short nNewValue);short GetInPutLen();该属性用于设置并返回Input属性从接收缓冲区读取的字符数。nNewvalue是short型数值,说明Input属性从接收缓冲区读取的字符数。InPutLen属性的默认值是0。当设置InPutLen为0时,使用Input将MSComm控件读取接收缓冲区中全部的内容。若接收缓冲区中InPutLen字符无效,Input属性返回一个零长度字符串()。在使用Input前,用户可以选择检查InBufferCount属性来确定缓冲区中是否已有需要数目的字符。该属性在从输出格式为定长数据的机器读取数据时非常有用。(8) InBuffersize属性void SetInBufferCount(short nNewValue);short GetInBufferSize();InBuffersize属性用于设置或返回输入缓冲区的大小,默认值为1024字节。(9) InBufferCount属性 void SetInBufferCount(short nNewValue); short GetInBufferCount(); InBufferCount属性用于返回输入缓冲区内的等待读取的字节个数,可以通过该属性值为0来清除接收缓冲区。(10) Input属性VARIANT GetInput();Input属性表示从接收缓冲区移走一串字符,将缓冲区中收到的数据读入变量。属性值为Variant型变量。该属性在端口未打开时不可用,在运行时是只读的。注意:当InputMode属性值为0时(文本模式),变量中含String型数据。当InputMode属性值为1(二进制模式时),变量中含Byte型数组数据。(11) PortOpen属性void SetPortOpen(BOOL bNewValue); BOOL GetPortOpen();PortOpen属性用于打开或者关闭端口。如果bNewValue设为True,可以打开端口;设为False时可以关闭端口。一般情况下在程序开始时打开端口,在程序结束时关闭端口。当你的应用程序终止时,MSComm控件将自动关闭串口。在打开端口前,确定CommPort属性设置为正确的端口号。而且,用户的串口设备必须支持Settings属性中的设置。如果硬件设备不支持Settings属性中的一些设置,则硬件工作或许不正确。(12) OutBuffersize属性void SetOutBufferSize(short nNewValue);OutBuffersize属性用于设置或者返回发送缓冲区的大写,值为整型表达式,表示传输缓冲区的字节数,默认值为512字节。对发送缓冲区设置的越大,应用程序可以使用的内存就越少。然而,如果你的发送缓冲区太小,缓冲区将会溢出,除非使用握手协议。(13) outBufferCounter属性void SetOutBufferSize(short nNew Value); short GetOutBufferSize();outBufferCounter属性用于返回发送缓冲区内等待发送的字节数,可以用来清空发送缓冲区。(14) OutPut属性void SetOutput(const VARIANT& newValue);OutPut属性用于向发送缓冲区写数据流。属性为Variant变量。该属性在端口未打开时不可用,在运行时是只写的。注意:OutPut属性.可以发送文本数据或二进制数据。传输文本数据时,应该将字符型数据放入Variant型标量中;传输二进制数据(即按字节传送)时,应将字节型数据放入Variant型变量中。如果通常给应用程序发送ANSI字符串,可以以文本方式发送。如果数据包含了内嵌控制字符,Null字符等,必须将其作为二进制传递过去。(15) CommEvent属性short GetCommEvent();如果在通信过程中发生错误或事件,将会引发OnComm事件并且改变其属性值。CommEvent属性值反映错误或者事件类型,通信程序的设计中可以根据该属性值执行不同的操作。该属性在端口未打开时不可用,在运行时是只读的。通信错误的设定值如表5所示,通信事件的设定值如表6所示。表5 通信错误设定值 设定值 值 描述comEventBreak1001接收到中断信号comEventCTSTO 1002Clear-to-send超时comEventDSRTO 1003Data-set ready超时comEventFrame 1004帧错误,硬件检测到一个帧错误,当双方设值的格式不一致时,就会引发此错误comEventOverrun 1006端口超速。一个字符没有在下一个字符到达之前被硬件读取,该字符丢失comEventCDTO 1007Carrier detect超时comEventRxOver 1008接收缓冲区溢出comEventRxParity 1009奇偶校验错误comEventTxFull 1010传输缓冲区溢出,表明输出缓冲区已满,不能再将字符排入输出缓冲区comEventDCB 1011检索端口、设备控制块(DCB)时的意外错误表6 通信事件设定值 设定值 值 描述comEvSend 1发送事件。发送缓冲区的内容少于SThreshold指定的值comEvReceive 2接收事件。接收缓冲区内字符数达到Rthreshold值,该事件在缓冲区内数据被移走前将持续产生,利用此事件可编写接收数据的过程ComEvCTS 3Clear-to-send线变化ComEvDSR 4Data-set ready线变化ComEvCD 5Carrier detect线变化comEvRing 6振铃检测comEvEOF 7文件结束。接收数据中出现文件结束(ASCII码26)字符(16) DTREnable属性void SetDTREnable(BOOL bNewValue); BOOL GetDTREnable();DTREnable属性确定在通信时是否使DTR(Data Terminal Ready)线有效,DTR使计算机发送到调制解调器的信号,表明计算机在等待数据传输。(17) RTSEnable属性void SetRTSEnable(BOOL bNewValue); BOOL GetRTSEnable();RTSEnable属性确定是否使RTS(Request To Send)线有效,一般情况下,由计算机发送RTS信号到连接的调制解调器,请求允许发送数据。(18) EOFEnable属性void SetEOFEnable(BOOL bNewValue); BOOL GetEOFEnable();EOFEnable属性确定在输入过程中MSComm控件是否寻找文件结尾(EOF)字符。如果找到EOF字符,将停止输入并激活OnComm事件,此时CommEvent属性设置为comEvEOF,这里bNewValue为布尔表达式,确定当找到EOF字符时,OnComm事件是否被激活。当bNewValue的设置值True时,EOF字符找到时OnComm事件被激活。否则当Value值设为False(缺省)时,EOF字符找到时OnComm事件不被激活。注意:当EOFEnable属性设置为False,OnComm控件将不在输入流中寻找EOF字符。(19) CDHolding属性void SetCDHolding(BOOL bNewValue); BOOL GetCDHolding(); 通过查询Carrier Detect (CD)线的状态确定当前是否有传输。Carrier Detect是从调制解调器发送到相联计算机的一个信号,指示调制解调器正在联机。该属性在设计时无效,在运行时为只读。属性的设置值为:当bNewValue为True时,Carrier Detect线为高电平;当bNewValue为False,Carrier Detect线为低电平。注意当Carrier Detect线为高电平(CDHoldingTrue)且超时时,MSComm控件设置CommEvent属性为comEventCDTO(Carrier Detect超时错误),并产生OnComm事件。注意:在主机应用程序中捕获一个丢失的传输是特别重要的,例如一个公告板,因为呼叫者可以随时挂起(放弃传输)。Carrier Detect也被称为Receive Line Signal Detect(RLSD).(20) DSRHolding属性void SetDSRHolding(BOOL bNewValue); BOOL GetDSRHolding();确定Data Set Ready (DSR)线的状态。Data Set Ready信号由调制解调器发送到相联计算机,指示作好操作准备。该属性在设计时无效,在运行时为只读。DSRHolding属性返回为True时,表示Data Set Ready线高,DSRHolding属性返回值为False时,表明Data Set Ready线低。当Data Set Ready线为高电平(DSRHoldingTrue)且超时时,MSComm控件设置CommEvent属性为comEventDSRTO(数据准备超时)并产生OnComm事件。当为Data Terminal Equipment(DTE)机器写Data Set Ready/Data Termial Ready握手例程时该属性是十分有用的。(二) MSComm控件串口编程基本流程VC+6.0提供的MSComm控件通过串行端口发送和接收数据,为应用程序提供串行通信功能。使用非常方便,但可惜的是,少有介绍MSComm控件的资料。下面就对VC+6.0中使用MSComm进行通信编程进行简单介绍。2.1 在当前Project中插入MSComm控件打开“Project-Add to Project-Components and Controls-Registered ActiveX controls-”菜单选择Components:Microsoft Communications Control,version 6.0命令插入到当前的Project中。结果就添加了类CMSComm。类CMSComm的相关文件mscomm.h和mscomm.cpp也一并加入Project中。如果Project是基于对话框的或Project中的视类是基于CFormView的,那么创建CMSComm类是相当简单的。只需在CFormView对应的对话框体中插入MSComm控件,再在视类的ClassWizard中为该控件声明一个变量即可,本文中设为m_Com。这样在程序运行中,该MSComm控件都将是有效的。在对话框中创建MSComm控件的过程也是相似的。如果视类不是基于CFormView的,那么就需要建立一个MSComm控件。创建的方法与普通的ActiveX控件的创建相类似。下面就是一个简单的例子:在MainFrm.h中添加下面声明语句:projected: CMSComm m_Com;在Mainfrm.cpp:OnCreate()函数中添加下列创建控件的语句:DWORD style=WS_VISIBLE|WS_CHILD;if (!m_Com.Create(NULL,style,CRect(0,0,0,0),this,ID_COMMCTRL)TRACE0(Failed to create OLE Communications Controln);return -1; / fail to create 2.2 初始化并打开串口对串口进行初始化一般来说要完成以下几个设置:设定通信端口号,即CommPort属性。设定通信协议,即HandShaking属性。设定传输速率等参数,即Settings属性。设定其它参数,有必要时再加上其它的属性设定。打开通信端口,即将PortOpen属性设为TRUE。下面通过一段简单的源代码对上述步骤进行说明(这里假定m_Com是有效的CMSComm对象,这个假定对于下文同样有效):m_Com.SetCommPort(1); /选择COM1m_Com.SetInBufferSize(1024); / 设置输入缓冲区的大小,Bytesm_Com.SetOutBufferSize(512); / 设置输入缓冲区的大小,Bytesif(!m_Com.GetPortOpen() / 打开串口 m_Com.SetPortOpen(TRUE);m_Com.SetInputMode(1);/ 设置输入方式为二进制方式m_Com.SetSettings(9600,n,8,1);/设置数据传输速率等参数m_Com.SetRThreshold(1);/ 为1表示有一个字符引发一个事件 m_Com.SetInputLen(0);2.3 捕捉串口事项MSComm控件可以采用查询或事件驱动的方法从端口获取数据。这里介绍使用比较广泛的事件驱动方法:有事件(如接收到数据)发生时通知程序,并在程序中需要捕获并处理这些通信事件。下面的例子就简单地实现了对串口事项的捕捉。在MainFrm.h中添加:protected: afx_msg void OnCommMscomm(); DECLARE_EVENTSINK_MAP()在Mainfrm.cpp中添加事件的映射:BEGIN_EVENTSINK_MAP(CM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业融资居间服务协议及内容
- 2025山东威海市文登区政联企业服务中心等国有企业招考工作人员3人备考考试题库附答案解析
- 2025江苏连云港市东海县教育系统江苏省乡村教师定向师范生定向招聘62人考试参考题库及答案解析
- 2025年河北邯郸磁县秋季博硕人才引进77人考试参考题库及答案解析
- 2025江西水利电力大学招聘1人(五)备考考试题库附答案解析
- 2025年职业资格企业人力资源管理师参考题库含答案解析(5卷)
- 2025云南昭通学院选聘产业导师9人备考模拟试题及答案解析
- 2025年特种作业类特种设备作业起重机指挥Q1-溶解乙炔气瓶充装P3参考题库含答案解析(5卷)
- 2025年特种作业类特种作业煤矿安全作业煤矿防突作业-煤矿采煤机(掘进机)操作作业参考题库含答案解析(5卷)
- 2025年特种作业类特种作业煤矿安全作业煤矿提升机操作作业-煤矿瓦斯抽采作业参考题库含答案解析(5卷)
- 二级豆粕创新创业项目商业计划书
- (统编2025版)道德与法治一年级上册教学计划(新教材)
- 2025云南昆明巫家坝建设发展有限责任公司招聘23人笔试备考题库及答案解析
- 2025北京事业单位考试试题及答案
- 2025年电气工程师高级专业考试题库
- 2024年山东省节能与双碳促进中心招聘真题
- 2025-2026学年统编版小学语文四年级上册教学计划及进度表
- 高二奋发+勇攀高峰+课件-2025-2026学年高二上学期开学第一课主题班会
- KTV突发事件安全应急预案
- DB15T 3543-2024 大蒜主要病虫害绿色防控技术规程
- 《液压与气动》课件(共十三章)
评论
0/150
提交评论