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和通信设备之间为了控制流速而设定的内部协议。属性值可以设置为下表中的任一个。
设定值 值 描述
ComNone 0 默认值, 无握手协议
comXOnXOff 1 XON/XOFF握手
ComRTS 2 RTS/CTS握手
comRtsXOnXOff 3 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();
其属性设定值如下表所示。
设定值 功能描述
TRUE CTS线为高电平
FALSE CTS线为低电平
该属性确定是否可通过查询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属性以文本方式取回数据
ComInputModeBinary 1 通过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 接收到中断信号
comEventCTSTO 1002 CTS超时
comEventDSRTO 1003 DSR超时
comEventFrame 1004 帧错误,硬件检测到一个帧出错,双方设置的格式不一致时,就会引发此错误
comEventOverrun 1006 端口超速。一个字符没有在下一个字符到达之前被硬件读取,该字符丢失
comEventCDTO 1007 数据检测超时
comEventRxOver 1008 接收缓冲区溢出
comEventRxParity 1009 奇偶校验错误
comEventTxFull 1010 传输缓冲区溢出,表明输出缓冲区已满,不能再将字符输出到缓冲区
comEventDCB 1011 检索端口、设备控制块(DCB)时的意外错误
通信事件设定值
设定值 值 描述
comEvSend 1 发送事件。发送缓冲区的内容少于SThreshold指定的值
comEvReceive 2 接收事件。接收缓冲区内字符数达到RThreshold值,该事件在缓冲区内数据被移走前将持续产生,利用此事件可编写接收数据的过程
comEvCTS 3 CTS线变化
comEvDSR 4 DSR线变化
comEvCD 5 CD线变化
comEvRing 6 振铃检测
comEvEOF 7 文件结束。接收数据中出现文件结束(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握手例程时该属性是分有用的。
ICON的使用
使用Visual C++ 6.0编制软件时,静态控件是最常用的控件之一。一般情况下,静态控件用作那些没有固定标题文本属性的控件(如文本编辑控件、列表框等)的标签,或者用来为控件分组,或者用来显示一些提示性的文件。实际上,静态控件除了显示静态文本这一基本功能外,还有许多其他的特殊功能,如在静态控件中可以显示图标、位图,甚至还可以在静态控件中显示动画。本文将通过示例程序来介绍静态控件的这些特殊用法。
1. 显示图标
⑴ 使用AppWizard创建一个基于对话框的MFC应用程序,设置其工程名为ShowIco。
⑵ 在对话框上增加一个静态控件。需要注意的是,有资源管理器添加的静态控件在默认情况下其ID均为IDC_STATIC,因此,如果需要在程序中区分和操纵各个不同的静态控件,一般情况下,需要更改新添加的静态控件的ID值。这里将静态控件的ID值设置为IDC_SHOWICO。
⑶ 在资源管理器中添加图标资源,其ID为IDI_ICON1。
⑷ 使用ClassWizard添加WM_INITDIALOG消息处理函数OnInitDialog。
⑸ 在OnInitDialog函数中下面的代码:
//获得指向静态控件的指针
CStatic *pStatic=(CStatic *)GetDlgItem(IDC_SHOWICO);
//加载图标
HICON hIcon=AfxGetApp()->LoadIcon(IDI_ICON1);
//设置静态控件的样式,使其可以使用图标,并试图标显示使居中
pStatic->ModifyStyle(0xF,SS_ICON|SS_CENTERIMAGE);
//设置静态控件图标
pStatic->SetIcon(hIcon);
运行该程序,显示如上图。
2.显示位图
⑴ 使用AppWizard创建一个基于对话框的MFC应用程序,设置其工程名为ShowBmp。
⑵ 在对话框上增加一个静态控件,将静态控件的ID值设置为IDC_SHOWBMP。
⑶ 在资源管理其中添加位图资源,其ID为IDB_INFO。
⑷ 使用ClassWizard添加WM_INITDIALOG消息处理函数OnInitDialog。
⑸ 在OnInitDialog函数中下面的代码:
//获得指向静态控件的指针
CStatic *pStatic=(CStatic *)GetDlgItem(IDC_SHOWBMP);
//获得位图句柄
HBITMAP Bitmap=::LoadBitmap(AfxGetApp()_hInstance,
MAKINTRESOURCE(IDB_INFO));
//设置静态控件的样式,使其可以使用位图,并试位标显示使居中
pStatic->ModifyStyle(0xF,SS_BITMAP|SS_CENTERIMAGE);
//设置静态控件显示位图
pStatic->SetBitmap(hBitmap);
运行该程序即可。
3. 显示动画
编写一个字符串在静态控件中不停的移动的程序。
⑴ 使用AppWizard创建一个基于对话框的MFC应用程序,设置其工程名为ShowAnimation。
⑵ 在对话框上增加一个静态控件。将静态控件的ID值设置为IDC_PREVIEW。
⑶ 使用ClassWizard添加WM_INITDIALOG消息处理函数OnInitDialog和WM_TIMER的消息处理函数OnTimer。
⑷ 在CshowAnimationDlg类中,增加两个变量m_x和m_y,用以表示字符串的坐标。
⑸ 在OnInitDialog函数中添加下列代码:
m_x=0;
m_y=0;
KillTimer(1);
VERIFY(SetTimer(1, 500, NULL) != 0);
1. 在CshowAnimationDlg类中,增加一个成员函数Draw()如下:
void CshowAnimationDlg::Draw()
{
CWnd *pWnd=GetDlgItem(IDC_PRE VIEW);
CDC *pDC=pWnd->GetDC();
RECT rect;
pWnd->GetClientRect(&rect);
pWnd->Invalidate();
pWnd->UpdateWindow();
pDC->SelectStockObject(BLACK_BRUSH);
pDC->Rectangle(0,0,rect.right,rect.bottom);
pDC->SetTextColor(RGB(255,0,0));
pDC->SetBkColor(RGB(0,0,0));
if((m_x>=rect.right)||(m_y>=rect.bottom-20))
{ m_x=0;
m_y=0;
}
pDC->TextOut(m_x,m_y,"动画");
}
2. 在OnTimer函数中,添加如下代码:
if (nIDEvent == 1)
{
m_x+=5;
m_y+=5;
Draw();
}
else CWnd::OnTimer(nIDEvent);