MSComm的属性介绍及其内部处理机制

1.CSerialPort类和MSComm该怎么选择

这里首先要澄清一个疑问:为什么已经有了CSerialPort类,我们还要去研究MSComm控件?这是因为CSerialPort类有局限(非MODEM应用),要对MODEM进行控制,还需要对类进行改写。而MSComm控件是微软提供的,功能相对来说更完善,而且还可以对中文进行处理,所以熟悉MSComm是非常必要滴!

2.MSComm控件消息处理及基本属性

串行通信处理方式
MSComm控件通信功能的实现,还是间接调用Windows API编程的结构。他提供了一系列标准通信命令的使用接口,利用它可以建立与串口的连接,并可以通过串口连接到其他设备,发出命令,交换数据以及见识和响应串行连接中发生的事故与错误。
目前,MSComm空间提供了“事件驱动”和“查询法”两种处理通讯问题的方法。
数据按驱动方式,是处理串行端口交互作用的一种非常有效的方法。在很多情况下,事件发生的时候要进行通知,这样我们就可以应用MSComm控件的OnComm()事件来捕获这些通信事件(当然啦,OnComm事件还可以检查和处理通信错误)。在实际的通信编程过程中,我们也正式在OnComm()事件处理函数中添加自己处理的代码,基于事件驱动-消息响应的方式可靠性极高!
查询方式,实质上还是事件驱动,在某些情况下该种方式可能更便捷。在程序的每个关键功能之后可以通过检查CommEvent属性值来查询事件和错误。
注意
在使用MSComm控件时,1个MSComm控件只能同时对应一个串口。如果应用程序需要访问和控制多个串口,那么必须使用多个MSComm控件
MSComm控件的属性介绍
MSComm有很多重要的属性,但常用的属性只要如下表所示:
CommPort设置并返回通信端口号
Settings以字符串的形式设置并返回波特率、奇偶校验、
数据位、停止位
PortOpen设置并返回通信端口状态/打开和关闭串口
Input从接收缓冲区返回和删除字符
Output向传输缓冲区写一个字符串
1.CommPort属性
功能:设置并返回通信端口号。
语法:
<span style="font-size:18px;">void CMSComm::put_CommPort(short nNewPort);//设置串口号
short CMSComm::get_CommPort();//查询当前串口号</span>
说明:nNewPort可以设置成1到16的任何数。但是,如果用OpenPort属性打开一个并不存在的端口时,MSComm控件会产生“设备无效的错误”【必须在打开串口前设置好串口的属性】。

2.RThreshold属性
功能:在MSComm控件设置CommEvent属性为comEvReceive并产生OnComm之前,设置并返回的要接收的字符数。
语法:
<span style="font-size:18px;">void CMSCommEvent::put_RTheshold(nNewValue);//串口缓冲区多于或等于?个字符时将引发一个接收数据的OnCommon事件
short CMSComm::set_RThreshold()</span>
说明:接收缓冲区收到nNewValue个字符产生OnComm事件。当接收字符后,若nNewValue设置为0(缺省值),则不产生OnComm事件。例如:当nNewValue = 1 时,则接受缓冲区手袋一个字符就会使得CMSComm控件产生OnComm消息。

3.CTSHolding属性
功能:确定是否可以通过查询Clear To Send(CTS)线的状态发送数据。Clear To Send是调制解调器发送到相关联计算机的信号,指示传输可以进行。该属性在设计的时候无效,在运行的时候为只读。
语法:
<span style="font-size:18px;">void CMSComm::put_CTSHolding(BOOL bNewValue);// TRUE 高电平 FALSE低电平
BOOL CMSComm::get_CTSHolding();</span>
说明:如果Clear To Send线为低电平(FALSE)并且超时时,MSComm控件设置CommEvent属性为comEventCTSTO(Clear To Send Timeout),并产生OnComm()事件。

4.SThreshold属性
功能:MSComm控件设置CommEvent属性为comEvSend并产生OnComm事件之前,设置并返回传输缓冲区中允许的最小字符数。
语法:
<span style="font-size:18px;">void CMSComm::put_SThreshold(short nNewValue);//OnComm时间之前,传输缓冲区中的最小字符数
short CMSComm::get_SThreshold();</span>
说明:SThreshold属性为0(缺省值),数据传输事件不会产生OnComm事件。若设置SThreshold属性为1,当传输缓冲区中的字符数小于value,则CommEvent属性设置为comEvSend,并产生OnComm事件。comEvSend事件仅当字符数与SThreshold交叉时被激活一次。例如:如果SThreshold=5,仅当在输出队列中字符数从5降到4时,comEvSend才会发生。

5.Handshaking属性
功能:设置或返回硬件握手状态,即设定串口通信设备之间的流控制。
语法:
<span style="font-size:18px;">void CMSComm::put_Handshaking( long nNewValue);
long CMSComm::get_Handshaking();</span>
Handshaking是指内部通信协议,通过该协议,数据从硬件端口传输到接收缓冲区。当一个数据字符到达串行端口,通信设备就把他移到收缓冲区。如果没有接收缓冲区,则程序需要直接从硬件读取每一个字符,这就会很可能造成数据丢失,因为字符到达的速度特别快。握手协议保证在缓冲区过载时,数据不会丢失,缓冲区过载为数据到达端口太快而使通信设备来不及将他移到接收缓冲区。

6. InputMode属性
功能:设置或返回传输数据类型。
语法:
<span style="font-size:18px;">void CMSComm::put_InputMode(long nNewValue);
long CMSComm::get_InputMode();
</span>
=0是指:以文本方式取回数据;=1是指以二进制方式捡回数据。

7.CDHolding属性
功能:通过查询Carrier Detect(CD)线的状态确定当前是否有传输。Carrier Detect是从调制解调器发送到相连计算机的一个信号,只是调制解调器正在联机,该属性设计时无效,运行时为只读。
语法:
<span style="font-size:18px;">void CMSComm::put_CDHolding(BOOL bNewValue);//TRUE = 线高电平;FALSE = 线低电平
BOOL CMSComm::get_CDHolding();</span>

8.DSRHolding属性
功能:确定Data Set Ready(DSR)线的状态。Data Set Ready信号由调制解调器发送到相连的计算机,只是做好操作准备。该属性在设计的时候无效,运行时为只读。
语法:
<span style="font-size:18px;">void CMSComm::put_DTREnable(BOOL bNewValue);//TRUE = 线高电平;FALSE = 线低电平;
BOOL CMSComm::get_DTREnable();</span>

9.Setting属性
功能:设置并返回波特率、奇偶校验、数据位、停止位参数。
语法:
<span style="font-size:18px;">void CMSComm::put_Setting(LPCTSTR lpszNewValue);
CString CMSComm::get_Setting();</span>
说明:当端口打开时,如果设置值lpszNewValue非法,则MSComm控件产生错误380(非法属性值)。

10.InputLen属性
功能:设置并返回Input属性从接收缓冲区读取的字符数。
语法:
<span style="font-size:18px;">void CMSComm::put_InputLen();
short CMSComm::get_InputLen();
</span>
说明:InputLen属性缺省值是0.设置InputLen为0时,使用Input将使MSComm控件读取接收缓冲区中全部的内容。
若接收缓冲区中InputLen字符无效,Input属性返回一个0长度的字符串。在使用Input前,用户可以选择检查InBufferCount属性来确定缓冲区是否已有需要数目的字符

11. InBufferSize属性
功能:设置或返回输入缓冲区的大小
语法:
<span style="font-size:18px;">void CMSComm::put_InBufferSize( short nNewValue);
short CMSComm::get_InBufferSize();</span>
说明:设置值缺省大小为1024字节。

12.InBufferCount属性
功能:设置或返回输入缓冲区内等待读取的字节个数
语法:
<span style="font-size:18px;">void CMSComm::put_InBufferCount( short nNewValue);
short CMSComm::get_InBufferCount();
</span>
说明:设置InBufferCount属性值为零时,可以清除接受缓冲区,这个功能非常常用。

13.OutBufferSize属性
功能:设置或返回发送缓冲区的大小
语法:
<span style="font-size:18px;">void CMSComm::put_OutBufferSize( short nNewValue);
short CMSComm::get_OutBufferSize();</span>
说明:设置值为字节数,默认为512。这个值不能太小,否则会造成缓冲区溢出,但太大也不必要的浪费内存。

14.OutBufferCount属性
功能:返回发送缓冲区的字节数,或者清空发送缓存区
语法:
<span style="font-size:18px;">void CMSComm::put_OutBufferCount(short bNewVable);
short CMSComm::get_OutBufferCount();</span>
说明:设置值为0时,表示清空发送缓冲区。

15.InPut属性
功能:从接收缓冲区内读取数据。
语法:
<span style="font-size:18px;">VARIANT CMSComm::grt_Input();</span>
说明:返回数据类型为VARIANT型变量,该属性在串口没有打开时不能用,在运行时是只读的。当InputMode=0时,采用了文本方式读取,变量中含有String型数据;当InputMode=1时,采用二进制,变量中含所有Byte数组型数据。

16.OutPut属性
功能:向发送缓冲区写数据,或者返回发送缓冲区当前的数据。
语法:
<span style="font-size:18px;">void CMSComm::put_Output( const VARIANT& newValue);
VARIANT CMSComm::get_Output();</span>
说明:该属性在串口没有打开是不可用。Output可以发送文本或二进制数据,但发送文本类型数据时,将数据直接放入到VARIANT型变量中;发送二进制数据时,将字节数据存放在VARIANT型变量中。

17.PortOpen属性
功能:用于打开或关闭串口,或者返回串口的开闭状态。
语法:
<span style="font-size:18px;">void CMSComm::put_PortOpen(BOOL bNewValue);//TRUE = 打开串口;FALSE = 关闭串口;
BOOL CMSComm::get_PortOpen();
</span>

18.EOFEnable属性
功能:确定在输入过程中MSComm控件是否寻找文件结尾字符(EndOfFile),如果找到EOF字符,将停止输入并激活OnComm事件,此时CommEvent属性设置为ComEvEOF。
语法:
<span style="font-size:18px;">void CMSComm::put_EOFEnable(BOOL bNewValble);//TRUE = 找到激活OnComm;FALSE = 找到不激活
BOOL CMSComm::get_EOFEnable();</span>

19. DTREnable属性
功能:设置或返回Data Terminal Ready(DTR)线状态。确定在通信时是否DTR线有效。DTR是计算机发送到调制解调器的信号,指示计算机在等待接受传输。
语法:
<span style="font-size:18px;">void CMSComm::put_DTREnable(BOOL bNewValue);//TRUE = 有效; FALSE = 无效;
BOOL CMSComm::get_DTREnable();</span>

20. RTSEnable属性
功能:确定是否是Request To Send(RTS)有效,一般情况下,由计算机发送RTS信号到连接好的调制解调器,已请示允许发送数据。
语法:
<span style="font-size:18px;">void CMSComm::put_RTSEnable(BOOL bNewValue);//TRUE = RTS线有效;FALSE = RTS线无效;
BOOL CMSComm::get_RTSEnable();
</span>

21.Break属性
功能:设置或清除中断信号状态。该属性在设计时无效。
语法:
<span style="font-size:18px;">void CMSComm::put_Break(BOOL bNewValue);//TRUE = 设置中断信号状态;FALSE = 清除中断信号状态
BOOL CMSComm::get_Break();</span>

22.CommID属性
功能:返回一个说明通行设备的句柄。该属性在设计时无效,在运行时为只读。
语法:
<span style="font-size:18px;">void CMSComm::put_NullDiscard(BOOL bNewValue);//TRUE = 不接受;FALSE = 接收;
BOOL CMSComm::get_NullDiscard();</span>

<span style="font-size:18px;">void CMSComm::put_CommID(long bNewValue);
long CMSComm::get_CommID();</span>

23.NULLDiscard属性
功能:确定Null字符是否是从端口传送到接收缓冲区。
语法:
<span style="font-size:18px;">void CMSComm::put_NullDiscard(BOOL bNEWVable);//TRUE = 不传送;FALSE =传送;
BOOL CMSComm::get_NullDiscard();</span>

24.OnComm事件和CommEvent属性
功能:设置或返回无论何时当CommEvent属性值发生变化时,就会产生OnComm事件,标志发生了一个通信事件或一个错误。CommEvent属性值表示错误或者是事件类型,通常在程序中的时间消息处理函数中对CommEvent事件进行处理。
语法:
<span style="font-size:18px;">void CMSComm::put_CommEvent(short nNewValue);
short CMSComm::get_CommEvent();
</span>
说明:通常有函数get_CommEvent()得到当前事件值,在进行相应的处理。
此外,可以使用OnComm事件和CommEvent属性捕捉并检验通信事件和错误的值。在发生通信事件或错误时,将触发OnComm事件,CommEvent值将会被改变。
  • 4
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值