第6章V B串口通信程序设计典型实例
利用VB开发串口通信程序既可以使用MSComm控件也可以调用Windows API函数实现。不过,只要MSComm控件可以被选用,我们推荐选择此控件实现,因为MSComm控件的功能和API调用一样强,甚至比它还好且使用起来更加简单。
在本章提供的串口通信程序设计中,除了PC与PC串口通信外,PC与单片机、PC与智能仪表、PC与PLC、PC与GSM短信模块等串口通信任务的实现均采用MSComm控件。
6.1 PC与PC串口通信程序设计
当两台串口设备通信距离较近时,可以直接连接,最简单的情况,在通信中只需3根线(发送线、接收线、信号地线)便可实现全双工异步串行通信。
本设计通过两台PC串口3线连接,介绍了利用API函数和MSComm控件设计串口通信程序的方法,包括字符与文件的发送与接收。
6.1.1 PC与PC串口通信程序设计目的
(1)掌握PC与PC串口通信的线路连接方法。
(2)利用MSComm控件和API函数实现PC与PC串口通信的程序设计方法。
6.1.2 PC与PC串口通信程序设计用软、硬件
本设计用到的硬件和软件清单如表6-1所示。
表6-1设计用软、硬件
序号名称数量
1 PC或IPC 2
2 串口通信线(三线制) 1
3 Visual Basic 6.0 1
6.1.3 PC与PC串口通信程序硬件线路图
线路说明,在计算机通电前,按图6-1所示将两台PC通过串口线连接起来:计算机A 串口COM1端口的TXD与计算机B串口COM1端口的RXD相连,计算机A串口COM1端口的RXD与计算机B串口COM1端口的TXD相连,计算机A串口COM1端口的GND与计算机B串口COM1端口的GND相连。
第6章VB串口通信程序设计典型实例
图6-1 PC与PC串口通信线路
6.1.4 设计任务
利用MSComm控件和VB API函数编写程序实现PC与PC串口通信。
任务要求,两台计算机互发字符并自动接收,如一台计算机输入字符串“Please return abc123”,单击“发送字符”命令,另一台计算机若收到,就输入字符串“abc123”,单击“发送字符”命令,信息返回到第一组的计算机。
实际上就是编写一个简单的双机聊天程序。
6.1.5 任务实现
6.1.5.1 利用MSComm控件实现字符型数据发送与接收
1.建立新工程
VB使用“工程”来管理每一个应用程序要使用的所有文件,每建立一个新程序,就要新建一个工程。一个工程由窗体、标准模块、控件及应用所需的开发环境设置等组成。
运行VB程序,出现“新建工程”对话框,选择“标准EXE”,单击“打开”命令按钮,进入VB工程集成开发环境,窗体设计器中自动出现一个名为Form1的空白窗体。
2.程序界面设计
向空白窗体添加各种控件,以完成预定的各种功能。开始一个项目的设计时,VB的工具箱中会有许多默认的控件让设计者予以选用,这些原本就出现在工具箱中的控件是内置控件,它提供了一些基本的系统设计组件给设计者,但功能比较特别的控件就不会出现在其中,如用来设计串口通信功能的控件MSComm就不在其中。
(1)添加串口通信控件MSComm。
由于VB的串行通信组件并不会主动出现在工具箱里中,当我们需要MSComm控件时,首先要把它加入到工具箱中。
让MSComm控件出现在工具箱中的步骤如下。
选择“工程”菜单下的“部件…”子菜单,在弹出的“部件”对话框中,在“控件”选项卡属性中选中“Microsoft Comm Control 6.0”复选框,单击“确定”按钮后,在工具箱中就出现了一个形似“电话”的图标,它就是MSComm控件。
– 173 –
Visual Basic 数据采集与串口通信测控应用实战
工具箱中有了MSComm 控件,就可以选择MSComm 控件的图标后将其添加到程序窗体上,利用该控件编程,PC 就可以通过VB 实现与串口设备的串口通信了。
由于每个使用的MSComm 控件对应着一个串行端口,如果应用程序需要访问多个串行
端口,必须添加多个MSComm 控件。
图6-2 程序窗体界面
(2)为了实现连续的自动接收,将工具箱中的Timer 控件添加到程序窗体上。
(3)添加两个文本框控件:Text1 和Text2,用于输入要发送的字符和显示要接收的字符。
(4)添加两个标签控件:Label1和Label2,作为发送和接收字符区的标签。
(5)添加一个按钮控件:Command1执行发送字符命令。 程序设计界面如图6-2所示。 3.属性设置
从属性窗口设置属性时,只需从对象列表框中选择待设置属性的对象,然后从属性列表的左列选择属性,最后在属性列表的右列中输入或选择新的属性值。
程序窗体、控件对象的主要属性设置如表6-2所示。
表6-2 窗体、控件对象的主要属性设置
控 件 类 型
主 要 属 性
功 能
(名称) = COMForm
窗体控件
BorderStyle = 3
运行时窗体固定大小 Form
Caption = PC 与PC 串口通信
窗体标题栏显示程序名称 (名称) = Label1
标签控件 Label
Caption = 显示接收字符区: 标签文本 (名称) = Label2
标签控件 Label
Caption = 输入发送字符区: 标签文本 (名称) = Textsend
文本框控件 MultiLine = True 允许多行显示 TextBox
ScrollBars = 2-Vertical 垂直滚动条可用 (名称) = TextReceive
文本框控件 MultiLine = True 允许多行显示 TextBox
ScrollBars = 2-Vertical
垂直滚动条可用 (名称) = Cmdsend 按钮控件 CommandButton Caption = 发送字符 手动发送字符 (名称) = MSComm1 串口通信控件 MSComm
其他属性在程序中设置
(名称) = Timer1
时钟控件 Enabled = True 时钟初始可用 Timer
Interval = 500
设置发送周期(ms )
– 174 –
第6章VB串口通信程序设计典型实例
两台计算机中VB程序界面及属性设置应完全相同,尤其MSComm控件的InputMode和Settings
属性值应相同。
4.程序代码设计
程序要实现自动发送或读取,在VB程序中有两个方式可以达到,一是查询方式,利用查询事件是否发生,当发生时,去执行默认的程序代码。可以使用计时器控件(Timer),该控件属性中的Interval可以控制计时器被启动的时间间隔,当时间间隔一到,便会执行原先放在计时器中的程序代码。
下面是利用查询方式编写的PC与PC串口通信的参考程序,代码如下所示:
api设计' 串口初始化
Private Sub Form_Load()
MSComm1.CommPort = 1 ' 设置通信端口号为COM1
MSComm1.Settings ="9600,n,8,1" ' 设置串口1参数
MSComm1.InputMode = 0 ' 接收文本型数据
MSComm1.PortOpen = True ' 打开通信端口1
End Sub
' 把字符通过串口发送出去
Private Sub Cmdsend_Click()
If Textsend.Text = "" Then
pp =MsgBox("发送的数据不能为空!", 16)
Exit Sub
End If
MSComm1.Output = Trim(Textsend.Text)
For i =1 To 20000000
Next i
End Sub
' 通过时钟控制来自动接收字符
Private Sub Timer1_Timer()
Dim buf$
buf =Trim(MSComm1.Input) ' 将缓冲区内的数据读入buf变量中
If Len(buf) <> 0 Then ' 判断缓冲区内是否存在数据
TextReceive.Text =TextReceive.Text + Chr(13) + Chr(10) + buf //回车换行
End If
End Sub
' 关闭通信端口,停止程序运行
Private Sub Cmdquit_Click()
MSComm1.PortOpen =False
Unload Me
End Sub
在Windows系统环境下,串口是系统资源的一部分。应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。在Windows系统的系统函数中,均包含了支持通信中断的功能。
二是使用事件方式。MSComm控件提供事件回应功能,可以利用此功能达到自动发送/接收的目的。下
面是利用事件方式编写的PC与PC串口通信的参考程序,界面设计与图6-2基本相同,区别是事件方式不需要时间控件。
'串口初始化
Private Sub Form_Load()
MSComm1.CommPort = 1 '设置通信端口号为COM1
– 175 –
Visual Basic数据采集与串口通信测控应用实战
MSComm1.Settings ="9600,n,8,1" '设置串口参数
MSComm1.InputMode = 0 '接收文本型数据
MSComm1.RThreshold =1 '接收缓冲区每收到一个字符都会使 MSComm 控件触发OnComm 事件
MSComm1.PortOpen = True '打开通信端口1
End Sub
'把字符通过串口发送出去
'启动定时器
Private Sub Cmdsend_Click()
If Textsend.Text ="" Then
pp =MsgBox("发送的数据不能为空!", 16)
Exit Sub
End If
MSComm1.Output =Trim(Textsend.Text)
End Sub
'MSComm 的 OnComm 事件程序
'由 CommEvent 属性值的不同,将各自的程序代码写入相关的子程序中
'只要 RThresold 中的设定字符数到达时便会使得 CommEvent 属性值变成 comEvReceive
'因此接收的子程序便会被执行
Private Sub MSComm1_OnComm()
Dim buf$
Select Case MSComm1.CommEvent
'通过取代每一个 case 表达式来处理每个事件与错误
Case comEvCD ' CD 线的状态发生变化
Case comEvCTS ' CTS 线的状态发生变化
Case comEvDSR ' DSR 线的状态发生变化
Case comEvReceive
buf =Trim(MSComm1.Input) '将缓冲区内的数据读入buf变量中
Case comEvSend
End Select
TextReceive.Text =TextReceive.Text & buf
End Sub
'停止程序运行
Private Sub Cmdquit_Click()
Unload Me
End Sub
'关闭通信端口,
Private Sub Form_Unload(Cancel As Integer)
MSComm1.PortOpen =False
End Sub
5.运行程序
程序设计、调试完毕,单击工具栏快捷按钮“启动”,运行程序。
两台计算机同时运行本程序。
首先在一台计算机程序窗体中发送字符区输入要发送的字符,如“我是第一组,收到请回话!”,单击“发送字符”按钮,发送区的字符串通过COM1口发送出去。
如果联网通信的另一台计算机程序收到字符,则返回字符串,如“收到,我是第2组!”,如果通信正常该字符串将显示在接收区中。
程序运行界面如图6-3所示。
– 176 –
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论