?
图2???? 数据采集模块原理图
4? 上位机通信程序设计
应用VB6.0内嵌MSComm控件只要通过简单的设置与编程,就能实现串行数据的发送与接收。MSComm控件提供了一系列封装好的标准串行通信的属性和方法,使用它可以建立应用程序和串口的连接,完成串行数据的发送与接收。其初始化属性设置如下:
If MSComm1.PortOpen=True Then
MSComm1.PortOpen=False
End If
MSComm1.CommPort=CommNum ‘串口号
'9600波特,无奇偶校验,8 位数据,一个停止位。
MSComm1.Settings="9600,N,8,1"
MSComm1.InputLen=0
MSComm1.RThreshold=20? ‘接收数据门限
MSComm1.SThreshold=0 ‘发送完不成生事件
MSComm1.InputMode=comInputModeBinary
‘通信为二进制模式
MSComm1.PortOpen=True ‘打开串口
MSComm1.InBufferCount=0 ‘清空接收缓冲区
MSComm1.OutBufferCount=0 ‘清空发送缓冲区
下位机向上位机发送的数据帧格式如图3所示:
?
?
图3???? 接收数据帧式
每一帧数据由20个字节组成,依次是:一个字节的帧起始标志为FF;一个字节的数据组号;16个字节的数据;一个字节的校验和,校验和是组号和16个字节的数据间相互异或的结果;最后一个字节为帧结束标志为FD。16个字节的数据中每个字节表示一片电池的电压值,为0~255的一个整数,将该数除以100及得到电压实际值,一般单片电池电压在0.5V~1.2V间。用MSComm进行串行通信接收数据时可采用两种方式实现,一种是查询方式,另一种是事件触发方式。在本系统中选择的是事件触发方式,每当接收缓冲区中数据字节数到达20个时就触发一个接收事件。接收通信程序如下:
Private Sub MSComm1_OnComm()
Dim InputData() As Byte
Dim strSum? As Byte
Dim i As Integer
Dim Volvalue(0 To 18) As Single
With MSComm1
Select Case .CommEvent?'判断通信事件
comEvReceive:???? ??'收到20字节的数据
InputData = .Input??‘读接收缓冲区
If InputData(0) = 253 And InputData(18) = 237 Then ‘判断收到的帧格式正确否
For i = 1 To 17 Step 1
Volvalue(i) = InputData(i)
Next I
strSum = InputData(1)
For i = 2 To 17??‘计算校验和
strSum = InputData(i) Xor strSum
Next I? ‘将接受数据校验和与发送校验和异或
If strSum = "0" Then?‘如果接收数据正确
Volvalue(N) = InputData(i) / 100
‘换算得到电压实际值
…………数据处理
Case Else
MSComm1.InBufferCount = 0 ‘清空接收缓冲区
MsgBox "串口通信错误"
Exit Sub
End? Sub
图2???? 数据采集模块原理图
4? 上位机通信程序设计
应用VB6.0内嵌MSComm控件只要通过简单的设置与编程,就能实现串行数据的发送与接收。MSComm控件提供了一系列封装好的标准串行通信的属性和方法,使用它可以建立应用程序和串口的连接,完成串行数据的发送与接收。其初始化属性设置如下:
If MSComm1.PortOpen=True Then
MSComm1.PortOpen=False
End If
MSComm1.CommPort=CommNum ‘串口号
'9600波特,无奇偶校验,8 位数据,一个停止位。
MSComm1.Settings="9600,N,8,1"
MSComm1.InputLen=0
MSComm1.RThreshold=20? ‘接收数据门限
MSComm1.SThreshold=0 ‘发送完不成生事件
MSComm1.InputMode=comInputModeBinary
‘通信为二进制模式
MSComm1.PortOpen=True ‘打开串口
MSComm1.InBufferCount=0 ‘清空接收缓冲区
MSComm1.OutBufferCount=0 ‘清空发送缓冲区
下位机向上位机发送的数据帧格式如图3所示:
图3???? 接收数据帧式
每一帧数据由20个字节组成,依次是:一个字节的帧起始标志为FF;一个字节的数据组号;16个字节的数据;一个字节的校验和,校验和是组号和16个字节的数据间相互异或的结果;最后一个字节为帧结束标志为FD。16个字节的数据中每个字节表示一片电池的电压值,为0~255的一个整数,将该数除以100及得到电压实际值,一般单片电池电压在0.5V~1.2V间。用MSComm进行串行通信接收数据时可采用两种方式实现,一种是查询方式,另一种是事件触发方式。在本系统中选择的是事件触发方式,每当接收缓冲区中数据字节数到达20个时就触发一个接收事件。接收通信程序如下:
Private Sub MSComm1_OnComm()
Dim InputData() As Byte
Dim strSum? As Byte
Dim i As Integer
Dim Volvalue(0 To 18) As Single
With MSComm1
Select Case .CommEvent?'判断通信事件
comEvReceive:???? ??'收到20字节的数据
InputData = .Input??‘读接收缓冲区
If InputData(0) = 253 And InputData(18) = 237 Then ‘判断收到的帧格式正确否
For i = 1 To 17 Step 1
Volvalue(i) = InputData(i)
Next I
strSum = InputData(1)
For i = 2 To 17??‘计算校验和
strSum = InputData(i) Xor strSum
Next I? ‘将接受数据校验和与发送校验和异或
If strSum = "0" Then?‘如果接收数据正确
Volvalue(N) = InputData(i) / 100
‘换算得到电压实际值
…………数据处理
Case Else
MSComm1.InBufferCount = 0 ‘清空接收缓冲区
MsgBox "串口通信错误"
Exit Sub
End? Sub