|
|
|
发表人:wosinfei |
发表时间:2007/5/14 11:16:00 |
|
发表新论题 |
本栏论题: |
Visual Basic 6.0 中通讯控件的应用(转载) [9093] |
张国荣 曹彩萍 史斌宁(合肥工业大学)
摘 要:随着智能测试仪器的快速增长,通过PC机来接收和处理它们采集的数据日显重要,因此掌握如何编写PC机的串口通讯程序很有实际意义。本文介绍了Visual Basic 6.0中的通讯控件的使用,并结合一个实例程序加以具体说明。
关键词:Visual Basic;通讯控件;串行口
现在大量的智能地质仪器都具备了RS-232通信接口,并提供了相应的通信协议,能够将测试、采集的数据传输给计算机等设备,以便进行大量数据储存、处理、查询和分析。通常便携式计算机是最便捷的工具,因为它不仅携带方便、处理和存储能力足够强,而且有丰富和强大的软件开发工具。Visual Basic是许多工程技术人员熟悉和常用的应用程序开发软件,如何用Visual Basic 6.0编写一个与相关仪器进行数据交换的通信程序,并将其链接到自己的数据处理软件,对于许多野外地质技术人员都很有实际意义。
一、MSComm通讯控件简介
微软的软件系统中,提供了MSComm通讯控件。该控件在windows\system目录下。通讯控件是PC机通过串行端口与其它设备实现轻松连接的通用工具,Visual basic、Visual C++等开发人员都可以使用它。通过使用MSComm通讯控件,可以简单高效地实现设备之间的通讯,而不必调用低级的API函数,从而使编程效率大大提高,也降低了因编程不当导致系统不稳定。
二、设计方法
1、创建新的工程
启动Visual Basic 6.0
在“文件”菜单中,单击“新建工程”,选择“标准.exe”,单击确定
2、加入MSComm控件
在“工程”菜单中,单击“部件”显示“部件”对话框
选定“Microsoft Comm Control 6.0”控件名称左边的复选框
单击“确定”关闭“部件”对话框。MSComm控件将出现在工具框中
将MSComm控件添加到窗体上
3、属性设置
现用实例具体说明。本实例用于接收和发送不定长数据包,该仪器的通信协议如下:
(1)链路层:8位数据位、1位停止位、无奇偶校验、19200波特率。
(2)包格式如下:
包头
站点号
命令
包序号
数据长度
数据1
…
数据n
校验和
包尾
4个0xfe
1byte
1byte
2byte
2byte
1byte
…
1byte
2byte
6个0xfc
CommPort 设置并返回通讯端口号。1~16,设置:1为COM1口
InBufferSize 设置并返回接收缓冲区的大小,以字节数为单位。设置:16500
InputMode 设置并返回数据输入方式。设置:comInputModeBinary输入为二进制数据
OutBufferSize 设置并返回输出缓冲区的大小,以字节数为单位。设置:512
Rthreshold设置并返回要接收的字符数。当接收缓冲区中的字符数大于等于该值时,将产生OnComm事件。设置:10
Setting以字符串形式设置或返回波特率、奇偶校验、数据位和停止位。设置:19200,n,8,1
4、编写代码
在窗体中加入一个组合框控件,名称为Comboport,用于选择设置通讯端口。加入一个命令按钮,用于控制通讯。加入一个通讯控件,名称为MSComm1。加入一个文本框控件,名称为Text1,用于显示接收的数据。
在窗体的Load事件中加入下列代码:
Private Sub Form_Load()
Dim I As Integer
For I = 1 To 16 '将项目添加到端口设置组合框控件
Comboport.AddItem "Com" & Trim$(Str$(I))
Next IComboport.ListIndex=MSComm1.CommPort – 1 '设置组合框控件缺省项目索引
strtemp = "" '清空接收数据串
End Sub
在命令按钮[进行通讯]的Click事件中加入如下代码:
Private Sub Command1_Click() '[进行通讯]按钮处理程序
Dim sendarr(30) As Byte '发送数据缓冲区
Text1.Text = "" '清数据显示区
If MSComm1.PortOpen Then '关闭串行口
MSComm1.PortOpen = False
End If
MSComm1.CommPort = Comboport.ListIndex + 1 '设置串行口号
MSComm1.RThreshold = 10 '设置至少要接收的字符数
MSComm1.PortOpen = True '打开串行口
sendarr(0) = &HFE '填发送收据
sendarr(1) = &HFE
sendarr(2) = &HFE
sendarr(3) = &HFE
sendarr(4) = &H30
sendarr(5) = &H32
sendarr(6) = &H0
sendarr(7) = &H30
sendarr(8) = &H0
sendarr(9) = &H0
sendarr(10) = &HFC
sendarr(11) = &HFC
sendarr(12) = &HFC
sendarr(13) = &HFC
sendarr(14) = &HFC
sendarr(15) = &HFC
MSComm1.Output = sendarr '发送给通讯控件
End Sub
在通讯控件的OnComm事件中加入如下代码:
Private Sub MSComm1_OnComm()
Dim Buffer As Variant '从通讯端口读取二进制数据,必须把它赋给一个字节数组
Dim Arr() As Byte
Static intcount As Integer '存储获得接收数据长度时已读入的字节数
Static templen As Integer '存储接收数据长度
Dim I As Integer
Dim bufcount As Integer
Static checksum As Long '存储计算的校验和
Dim recievesum As Long '存储接收的校验和
Select Case MSComm1.CommEvent '根据 CommEvent 属性值分支处理
Case comEvReceive '接收到规定个数字符
bufcount = MSComm1.InBufferCount '获得已接收字符数
Buffer = MSComm1.Input '读接收的二进制数据
Arr = Buffer '赋值于字节数组以便处理
If intcount = 0 Then '读入的是数据长度
templen = Arr(8) * 256 + Arr(9) '获得数据长度
If templen + 15 > bufcount Then '设置下次读入字节数
MSComm1.RThreshold = templen + 15 - bufcount
Else
MSComm1.RThreshold = 1
End If
intcount = bufcount '存储已读入接收数据的字节数
For I = 0 To bufcount - 1
recievebuf(I) = Arr(I) '存储数据到接收数据缓冲区
strtemp = strtemp + Str(Arr(I)) '转换成字符串以便显示
If I >= 10 Then
checksum = checksum + Arr(I) '计算校验和
End If
Next I
Text1.Text = strtemp '显示接收数据
Else '读入的是数据
For I = 0 To bufcount - 1
recievebuf(intcount + I) = Arr(I) '存储数据到接收数据缓冲区
strtemp = strtemp + Str(Arr(I)) '转换成字符串以便显示
If intcount + I < templen + 10 Then
checksum = checksum + Arr(I) '计算校验和
End If
Next I
Text1.Text = strtemp '显示接收数据
'计算接收到的校验和
recievesum = recievebuf(templen + 10) * 2 ^ 8 + recievebuf(templen + 11)
'比较校验和
If (recievesum Mod 65536) <> (checksum Mod 65536) Then
MsgBox "校验和错", vbOKOnly, "Confirm" ' 显示信息。
End If
checksum = 0 '准备下次接收,设置初始数据
recievesum = 0
strtemp = ""
MSComm1.RThreshold = 10
intcount = 0
MSComm1.PortOpen = False '关闭串行口
End If
End Select
End Sub
三、结束语
本实例已投入实际使用,它虽然只是针对一种仪器的协议编写的,但其方法和步骤完全适用于其它仪器设备。希望本文能给读者提供一些参考与启迪。
|
|
以下是关于《Visual Basic 6.0 中通讯控件的应用(转载)》论题的回复(共5篇) |
|
回复人:xiashuangr |
回复时间:2007/9/20 6:49:00 |
|
|
|
|
回复人:剑胆琴心 |
回复时间:2008/12/6 13:03:00 |
|
|
|
|
回复人:676967246 |
回复时间:2011/5/27 8:29:00 |
|
|
|
|
回复人:fg1007 |
回复时间:2011/6/11 17:00:00 |
|
|
|
|
回复人:xsliweju |
回复时间:2019/12/15 11:19:00 |
|
|
|
相关技术论坛: |
|
|