使用VB中的MSComm控件实现RS-232串口通信实验准备:需要准备一些与串口通信有关的设备,如(外置式)调制解调器、计算机串口与调制解调器的连接线、一根DTE到DTE的无调制解调器连接线(接法见本章有关习题的参考答案),在实验前检查计算机的两个串口是否能够正常工作。
实验环境:Windows 95/98操作系统,Microsoft VB 5.0以上程序设计环境。
对例题中涉及调制解调器的内容,采用计算机与调制解调器连接的方式;对在例题中VB(1(CD)(2来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“OK”响应。
每个使用的MSComm控件都对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个MSComm控件。
可以在Windows“控制面板”中改变端口地址和中断地址。
下面这个简单的例子采用了轮询方法演示了用调制解调器进行基本的串行通讯:Private Sub Form_Load()Dim Instring As String '保存输入子串的缓冲区mPort=3 '使用COM3。
MSComm1.Settings="2400,N,8,1"'2400波特率,无奇偶校验,8位数据位,一位停止位下面我们将讲述一下MSComm控件的所有属性,其中前5个是最基本的,必须首先掌握。
⑴MsComm控件属性1)CommPort,设置并返回通讯端口号。
语法为:mPort[=value]说明:value一为一个整型值,说明端口号。
在设计时,va1ue可以设置成从1到16的任何数(缺省值为1)。
但是如果用PortOpen属性打开一个并不存在的端口时,MSComm控件会产生错误68(设备无效)。
注意:必须在打开端口之前设置CommPort属性的值。
2)Settings,设置并返回波特率、奇偶校验、数据位、停止位参数。
语法为:0bject.Settings[=value]S为件不支持的通讯设置值,那么硬件可能不会正常工作。
如果在端口打开之前,DTREnable或RTSEnable属性设置为True,当关闭端口时,该属性设置为False。
否则,DTR和RTS线保持其先前的状态。
下例以波特率2400打开4号通讯端口,没有奇偶检查,7个数据位,1。
5个停止位:MSComm1.Settings="2400,n,7,1.5"mPort=4MSComm1.PortOpen=True4)Input,返回并删除接收缓冲区中的数据流。
该属性在设计时无效,在运行时为只读。
语法为:Object.Input说明:InputLen属性确定被Input属性读取的字符数。
设置InputLen为0,则为End IfEnd Sub5)Output,往传输缓冲区写数据流。
该属性在设计时无效,在运行时为只读。
语法为:object.Output[=value]说明:value一为准备写到传输缓冲区中去的一个字符串。
Output属性可以传输文本数据或二进制数据。
用Output属性传输文本数据,必须定义一个包含一个字符串的Variant。
发送二进制数据,必须传递一个包含字节数组的variant到Output属性。
一般情况下,如果发送一个ANSI字符串到应用程序,可以以文本数据的形式发送。
如果发送包含嵌人控制字符、Null字符等等的数据,要以二进制形式发送。
例:这个例子说明如何将用户键人的每一个字符送到串行端口:7)8)CommEvent,返回最近的通讯事件或错误。
该属性在设计时无效,在运行时为只读。
9)CommID,返回一个说明通讯设备的句柄。
该属性在设计时无效,在运行时为只读。
说明:该值与Windows API CreateFile函数返回的值一致。
在WindowsAPI中调用任何通讯例程时使用该值。
10)C TSHolding,确定是否可通过查询ClearToSend(CTS)线的状态发送数据。
C1earTo Send是调制解调器发送到相联计算机的信号,指示传输可以进行。
该属性在设计时无效,在运行时为只读。
11)D SRHolding,确定DataSetReady(DSR)线的状态。
Data Set Ready信号由调制解调器发送到相连计算机,指示作好操作准备。
该属性在设计时无效,在运行时为只读。
12)D TREnable,确定在通讯时是否使DataTerminalReady(DTR)线有效。
Data Terminal13)E(Handshaking是指内部通讯协议,通过该协议,数据从硬件端口传输到接收缓冲区。
当一个数据字符到达串行端口,通讯设备就把它移到接收缓冲区以使程序可以读它。
如果没有接受缓冲区,程序需要直接从硬件读取每一个字符,这很可能会造成数据丢失,因为字符到达的速度可以非常快。
握手协议保证在缓冲区过载时数据不会丢失,缓冲区过载为数据到达端口太快而使通讯设备来不及将它移到接收缓冲区。
15)I nBufferCount,返回接收缓冲区中等待的字符数。
该属性在设计时无效。
说明:InBufferCount是指调制解调器已接收,并在接收缓冲区等待被取走的字符数。
可以把InBufferCount属性设置为0来清除接收缓冲区。
"")。
有需要数目的字符。
该属性在从输出格式为定长数据的机器读取数据时非常有用。
例:这个例子说明如何读取25个数据字符:Private CmdRead_Click()Dim CommData as StringMSComm1.1nputLen=25 '确定一个25个字符的数据块。
CommData=MSComm1.Input '读数据。
End Sub18)I nputMode,设置或返回Input属性取回的数据的类型。
说明:InputMode属性确定Input属性如何取回数据。
数据取回的格式或是字符串或是一数据组的二进制数据的数组。
若数据只用ANSI字符集,则用comInputModeText。
对其它字符数据,如数据中符的字符。
说明:缺省的情况是,Mscomm控件用问号(?)替换非法字符。
如果设置parityRep1ace为一个空字符串(""),则当奇偶校验错误出现时,字符替换无效。
但onComm事件仍然产生,并且设置CommEvent。
属性为comEventRXparity。
ParityReplace字符被用于面向字节的操作,它必须是单字节字符。
可指定0到255之间的任何ANSI字符代码。
23)R threshold,在MSCoinm控件设置CommEvent属性为comEvReceive,并产生onComm事件之前,设置并返回的要接收的字符数。
24)R TSEnable,确定是否使Requestrosend(RTS)线有效。
一般情况下,由计算机发送RequestToSend信号到联接的调制解调器,以请示允许发送数据。
25)S threshold,在MSComm控件设置。
CommEvent属性为comEvSend并产生onComm事件之前,设置并返回传输缓冲区中允许的最小字符数。
1)和控件及属性设置:程序代码:'发送窗体程序Private Sub Form_Load()mPort = 1 '使用COM1。
End Sub'接收窗体程序Private Sub Form_Load()mPort = 2 '使用COM2。
MSComm1.Settings = "2400,N,8,1"MSComm1.InputLen = 0MSComm1.PortOpen = TrueEnd SubPrivate Sub Form_Click()Text1.Text = MSComm1.Input '从串行端口读内容。
End SubPrivate Sub Form_Unload(Cancel As Integer)1)2)3)状态,工程名称:MSComm_Show2.vbp发送窗体名称:MSComm_Send2.frm接收窗体名称:MSComm_Receive_Realtime.frm控件及属性设置:Private Sub Form_Unload(Cancel As Integer) MSComm1.PortOpen = FalseEnd Sub'接收窗体程序Private Sub Form_Load()mPort = 2 '使用COM2。
MSComm1.Settings = "2400,N,8,1"MSComm1.InputLen = 0MSComm1.PortOpen = TrueMscomm_Receive_Reatime.Show '显示轮询接收窗体,启动接收程序End Sub1)2)用鼠标将光标设置到发送窗体的文本框中,在文本框中输入字母或数字,观察接受窗口的文本框有无变化;3)请将接受窗体的MSComm1的Rthreshold属性改为5,重新启动程序,注意收发过程的变化,请考虑一下程序执行的过程和实时方式的工作原理。