VC中使用MScomm时,如何进行超时处理

VC中使用MScomm时,如何进行超时处理,第1张

这是我程序中的代码,已经使用了,没有问题。

在CMainFrame中添加两个成员变量,并在构造函数中初始化:

m_bPrepared = false

m_bInitiated = false

下面是OnComm函数和OnTimer函数:

void CMainFrame::OnComm()

{

if (!m_bInitiated) // 初始化一次,即第一次信号不接收

{

m_bInitiated = true

m_bPrepared = true

return

}

if (m_msComm.GetCommEvent() == 3) // 接收到信号

{

if(m_bPrepared)

{

// 你的处理函数

Function()

m_bPrepared = false

SetTimer(1, 500, NULL) // 延时500毫秒

}

}

}

void CMainFrame::OnTimer(UINT nIDEvent)

{

// TODO: Add your message handler code here and/or call default

if (nIDEvent == 1)

{

KillTimer(1)

m_bPrepared = true

}

CFrameWnd::OnTimer(nIDEvent)

}

串口类是什么类?

库是:MSCommLib.dll?吗

sp是什么类型的?是你自己做的类?你在ReadLine内部是如果调用MsComm的

根据自己的应用了.

@MSComm.CommPort = PrinterComm[terminalNumber]

@MSComm.Settings = "19200,N,8,1"//设置通信口参数

@MSComm.InBufferSize = short.MaxValue / 2//设置MSComm2接收缓冲区为32字节

@MSComm.OutBufferSize = 800//设置MSComm2发送缓冲区为2字节

@MSComm.InputMode = MSCommLib.InputModeConstants.comInputModeBinary//设置接收数据模式为二进制形式

@MSComm.EOFEnable = true

@MSComm.SThreshold = 0//设置Output 一次从发送缓冲读取字节数为1

@MSComm.InBufferCount = 0//清除接收缓冲区

@MSComm.OutBufferCount = 0//清除发送缓冲区

@MSComm.RThreshold = 1//设置接收1个字节产生OnComm事件

@MSComm.DTREnable = true//??

@MSComm.Handshaking = MSCommLib.HandshakeConstants.comNone

//@MSComm.InBufferSize = 1024

@MSComm.InputLen = 0//决定每次Input读入的字符个数,缺省为0,表示读取接收缓冲区的全部内容

@MSComm.NullDiscard = false

@MSComm.PortOpen = true//打开串口14

上面设置后,添加一个事件。当有数据来的时候触发。

MSPrinter.OnComm +=new DMSCommEvents_OnCommEventHandler(_OnComm0)

private void _OnComm0()

{

ReceiveBytes = (byte[])MSPrinter.Input//这样读收到的数据。

...

}

小妹给个分吧。大哥没有分提问了。。

MSComm控件属性大揭秘

MSComm控件的属性

(必须要熟悉的几个——CommPort:设置并返回通信端口号;Setting:以字符串的形式设置并返回数据传输速率、奇偶校验、数据比特、停止比特;PortOpen:设置并返回通信端口的状态,也可以打开和关闭端口;Input:从接收缓冲区返回和删除字符;Output:向传输缓冲区定一个字符串)

1)CommPort属性

void SetCommPort(short nNewValue)short GetCommPort()

这一属性设置并返回连接的串行端口号,Windows将会利用该串口和外界通信。在设计时,nNewValue可以设置成从1~16的任何数(默认值为1)。但是如果用PortOpen属性打开一个并不存在的端口时,MSComm控件会产生错误68(设备无效)。

注意:必须在打开端口之前设置CommPort属性。

2)Settings属性

void Settings(LPCTSTR lpszNewValue)String GetSettings()

该属性用于设置并返回数据传输速率、奇偶校验、数据比特、停止比特参数。当端口打开时,如果value非法,则MSComm控件产生错误380(非法属性值)。其中lpszNewValue用字符串表示,由四个设置值组成,有如下的组成格式:

“BBBB,P,D,S”

BBBB为数据传输速率,P为奇偶校验,D为数据比特,S为停止比特。Value的默认值是:“9600,N,8,1”,数据传输速率合法值可以是110、300、600、1200、2400、4800、9600、14400、19200、28800、38400、56000、57600、115200、12800、25600。

奇偶校验值可以是设置为下表的任一值。

设定值描述

E偶校验(EVEN)

M标号校验(MARK)

N无校验(NONE)

O奇校验(ODD)

S空格校验(SPACE)

数据比特数可以是4、5、6、7、8。

停止比特数可以是1、1.5、2。

注意:只有当通信的双方的Settings属性值都一样时,通信连接才能生效。

3)Handshaking属性

这一属性用于设置或者返回硬件握手协议,也就是PC和通信设备之间为了控制流速而设定的内部协议。属性值可以设置为下表中的任一个。

设定值值描述

ComNone0默认值,无握手协议

comXOnXOff 1XON/XOFF握手

ComRTS 2RTS/CTS握手

comRtsXOnXOff3 RTS/CTS和XON/XOFF握手皆可

4)RThreshold属性

void SetRThreshold(short nNewValue)short GetRThreshold()

在MSComm控件设置CommEvent属性为comEvReceive并产生OnComm之前,RThreshold属性设置并返回的要接收的字符数。这里nNewValue是short型参数,说明在产生OnComm事件之前要接收的字符数。

当接收字符后,若RThreshold属性设置为0(默认值)则不会产生OnComm事件。否则,该属性为一阈值,当接收缓冲区内字节个数达到或超过该值后就会产生OnComm事件,例如,设置RThreshold为1,接收缓冲区收到每一个字符都会使MSComm控件产生OnComm事件。

5)CTSHolding属性

void SetCTSHolding(BOOL bNewValue)BOOL GetCTSHolding()

其属性设定值如下表所示。

设定值功能描述

TRUECTS线为高电平

FALSECTS线为低电平

该属性确定是否可通过查询CTS线的状态发送数据。CTS是调制解调器发送到相连计算机的信号,指示传输可以进行。该属性在设计时无效,在运行时为只读。

如果CTS线为低电平(CTSHolding =

FALSE)并且超时时,MSComm控件设置CommEvent属性为comEventCTSTO(Clear To Send

Timeout)并产生OnComm事伯。CTS线用于RTS/CTS硬件握手。如果需要确定CTS线的状态,CTSHolding属性给出一种手工查询方法。

6)SThreshold属性

void SetSThreshold(short nNewValue)short GetSThreshold()

MSComm控件设置CommEvent属性为comEvSend并产生OnComm事件之前,设置并返回传输缓冲区中允许的最小字符数。这里nNewValue是short型数据,代表在OnComm事件产生之前在传输缓冲区中的最小字符数。

若设置Sthreshold属性为0(默认值),数据传输事件不会产生OnComm事件。若设置Sthreshold属性为0,当传输缓冲区完全空时,MSComm控件产生OnComm事件。如果在传输缓冲区的字符数小于value,CommEvent属性设置为comEvSend,并产生OnComm事件。comEvSend事件仅当字符数与Sthreshold交叉时被激活一次。例如,如果Sthreshold等于5,仅当在输出队列中字符数从5降到4时,comEvSend才发生。如果在输出队列中从没有比Sthreshold多的字符,comEvSend事件将绝不会发生。

7)InputMode属性

void SetInputMode(long nNewValue)long GetInputMode()

访属性用于设置或者返回传输数据的类型。其取值和基本含义如下表所示。

设定值值描述

ComInputModeText(缺省)0通过Input属性以文本方式取回数据

ComInputModeBinary1通过Input属性以二进制方式取回数据

8)InputLen属性

void SetInputLen(short nNewValue)short GetInputLen ()

该属性用于设置并返回Input属性从接收缓冲区读取的字符数。nNewValue是short型数值,说明Input属性从接收缓冲区中读取的字符数。

InputLen属性的默认值是0。当设置InputLen为0时,使用Input将使MSComm控件读取接收缓冲区中全部的内容。若接收缓冲区中InputLen字符无效,Input属性返回一个零长度字符串(“”)。在使用Input前,用户可以选择检查InBufferCount属性来确定缓冲区中是否已有需要数目的字符。该属性在从输出格式为定长数据的机器读取数据时非常有用。

9)InBuffersize属性

void SetBufferSize(short nNewValue)short GetInBufferSize()

InBuffersize属性用于设置或返回输入缓冲区的大小,默认值为1024字节。

10)InBufferCount属性

void SetInBufferCount(short nNewValue)short

GetInBufferCount()

InBufferCount属性用于返回输入缓冲区内的等待读取的字节个数,可以通过该属性值为0来清除接收缓冲区。

11)Input属性

VARIANT GetInput()

Input属性表示从接收缓冲区移走一串字符,将缓冲区中收到的数据读入变量。属性值为VARIAN型变量。该属性在端口未打开时不可用,在运行时是只读的。

注意:当InputMode属性值

为0时(文本模式),变量中含String型数据。当InputMode属性值为1(二进制模式),变量中含Byte型数组数据。

12)PortOpen属性

void SetPortOpen(BOOL bNewValue)BOOL GetPortOpen()

PortOpen属性用于打开或者关闭端口。如果bNewValue设为TRUE,可以打开端口;设为FALSE时可以关闭端口。

一般情况下在程序开始时打开端口,在程序结束时关闭端口。当应用程序终止时,MSComm控件将自动关闭串

口。在打开端口前,确定CommPort属性调协为正确的端口号。而且,用户的串口设备必须支持Settings属性中的设置。如果硬件设备不支持Settings属性中的一些设置,则硬件工作或许不正确。

13)OutBuffersize属性

void SetOutBufferSize(short nNewValue)

OutBuffersize属性用于设置或者返回发送缓冲区的大小,值为整形表达式,表示传输缓冲区的字节数,默认值为512字节。对发送缓冲区设置得越大,应用程序可以使用的内存就越小。然而,如果发送缓冲区太小,缓冲区将会溢出,除非使用握手协议。

14)OutBufferCounter属性

void SetOutBufferSize(short nNewValue)short

GetOutBufferSize()

OutBufferCounter属性用于返回发送缓冲区内等待发送的字节数,可以通过设置该属性为0来清空发送缓冲区。

15)Output属性

void SetOutput(const VARIANT &newValue)

Output属性用于向发送缓冲区写数据流。属性为VARIANT变量。该属性在端口未打开时不可用,在运行时只是写的。

注意:Output属性可以发送文本数据或二进制数据。传输文本数据时,应该将字符型

数据放入VARIANT变量中;传输二进制数据(即按字节传送)时,应将字节型数据放入VARIANT型变量中。如果通常给应用程序发送ANSI字符串,可以以文本方式发送。如果数据包含了内嵌控制字符、NULL字符等,必须将其作为二进制传递过去。

16)CommEvent属性

short GetCommEvent()

如果在通信过程中发生错误或事件,将会引发OnComm事件并且改变其属性值。CommEvent属性值反映错误或者事件类型,通信的设计中可以根据该属性值执行同的 *** 作。该属性在端口未打开时不可用,在运行时是只读的。通信错误及通信事件的设定值分别如下两表所示。

通信错误设定值

设定值值描述

comEventBreak 1001接收到中断信号

comEventCTSTO1002CTS超时

comEventDSRTO1003DSR超时

comEventFrame1004帧错误,硬件检测到一个帧出错,双方设置的格式不一致时,就会引发此错误

comEventOverrun1006端口超速。一个字符没有在下一个字符到达之前被硬件读取,该字符丢失

comEventCDTO 1007数据检测超时

comEventRxOver1008接收缓冲区溢出

comEventRxParity1009奇偶校验错误

comEventTxFull1010传输缓冲区溢出,表明输出缓冲区已满,不能再将字符输出到缓冲区

comEventDCB1011检索端口、设备控制块(DCB)时的意外错误

通信事件设定值

设定值值描述

comEvSend1发送事件。发送缓冲区的内容少于SThreshold指定的值

comEvReceive2接收事件。接收缓冲区内字符数达到RThreshold值,该事件在缓冲区内数据被移走前将持续产生,利用此事件可编写接收数据的过程

comEvCTS3CTS线变化

comEvDSR4DSR线变化

comEvCD5CD线变化

comEvRing6振铃检测

comEvEOF7文件结束。接收数据中出现文件结束(ASCII 码26)字符

17)DTREnable属性

void SetDTREnable(BOOL bNewValue)BOOL GetDTREnable()

DTREnable属性确定在通信时是否使用DTR线有效,DTR是计算机发送到调制解调器的信号,表明计算机在等待数据传输。

18)RTSEnable属性

void SetRTSEnable(BOOL bNewValue)BOOL GetRTSEnable()

RTSEnable属性确定是否使用RTS线有效。一般情况下,由计算机发送RTS信号到连接的调制解调器,请求允许发送数据。

19)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字符。

20)CDHolding属性

void SetCDHolding(BOOL bNewValue)BOOL GetCDHolding()

通过查询CD线的状态确定当前是否有传输。CD是从调制解调器发送到相连计算机的一个信号,指示调制解调器正在联机。该属性在设计时无效,在运行时为只读。属性的设置值为:当bNewValue为TRUE时,CD线为高电平;当bNewValue为FALSE时,CD线为低电平。注意当CD线为高电平(CDHolding=TRUE)且超时时,MSComm控件设置CommEvent属性为comEventCDTO(CD超时错误),并产生OnComm事件。

注意:在主机应用程序中捕获一个丢失的传输是特别重要的,例如一个公告板,因为呼叫者可以随时挂起(放弃传输)。CD也被称为Receive

Line Signal Detect(RLSD)。

21)DSRHolding属性

void SetDSRHolding(BOOL bNewValue)BOOL GetDSRHolding()

确定DSR线的状态。DSR信号由调制解调器发送到相连计算机,指示作好 *** 作准备。该属性在设计时无效,在运行时为只读。DSRHolding属性返回为TRUE时,表示DSR线高,返回FALSE时,表示DSR线低。当DSR线为高电平时(DSRHolding=TRUE)超时时,MSComm控件设置CommEvent属性为comEventDSRTO(数据准备超时)并产生OnComm事件。当为DTE(Data

Terminal Equipment)机器写DSR/DTR握手例程时该属性是分有用的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7888658.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存