系统部分功能程序的实现
(1)端口控制的实现
当打开检测界面时,上位机端口默认COM1打开,使用者需选择相应的端口,具体执行代码如下:
If MSComm1.PortOpen Then ’先关闭原打开的端口,以便重新打开新端口MSComm1.PortOpen = False
End If
mPort = Index + 1 ’根据端口索引设置COM号
MSComm1.PortOpen = True
If MSComm1.PortOpen Then
Label1.Caption = "OBD端口COM"& Index + 1 &"已打开!"’提示打开的端口号
Else
Label1.Caption = "OBD端口COM"& Index + 1 &"无法打开!"’若所选择端口无法打开则提示
(2)仪器控制功能的实现
本次设计中,程序通过以下命令,可实现相应的控制功能:
outnum(1) = "控制代码" '将相应控制命令以字符串赋值给outmum()数组
MSComm1.Output = outnum&0x0d ’对仪器发送控制命令
MODE03读取故障码
MODE04清除故障码
实现各种功能的控制代码如下:
outnum(1) = "0101" ’用MODE01命令0101读取故障码数量,如果返回410181076504,则(81)H=129,共有129-128个故障码outnum(1) = "0105" ’用MODE01命令0105读取发动机水温,返回如果41057B,7B表示水温123D,水温是123-40=80度
outnum(1) = "010C" ’用MODE01命令010C读取发动机转速,如410C1AF8,1AF8=6904,转速=6904/4=1726rpm
outnum(1) = "03" ’用MODE03命令03读取故障码
outnum(1) = "04" ’用MODE04命令04清除故障码
outnum(1) = "0101" ’用MODE01命令0101读取故障码数量outnum(1) = "0101" ’用MODE01命令0101读取故障码数量outnum(1) = "0101" ’用MODE01命令0101读取故障码数量outnum(1) = "0101" ’用MODE01命令0101读取故障码数量
(3)端口数据接收功能的实现
当向仪器端口发送相应的控制命令后,可以用下面的子程序实现对仪器响应的接收。
Private Sub Receive() ’数据接收子程序
Dim receivecount As Integer
Dim Counter As Integer ’接收数据个数计数器
Dim i As Integer ’循环变量
If (MSComm1.InBufferCount > 0) Then
Counter = MSComm1.InBufferCount ’读取接收数据个数
receiveData = ""’清缓冲
i = 0
ReceiveArr = ""
ReceiveArr = MSComm1.Input ’数据放入数组
For i = 0 To (Counter - 1) Step 1 ’数据格式处理
If (ReceiveArr(i) < 16) Then
receiveData = receiveData &"0"+ Hex(ReceiveArr(i))’小于16,前面加0
Else
receiveData = receiveData & Hex(ReceiveArr(i)) ’加空格显示
End If
Next i
End If
End Sub
(4)判断缓存区数据正确性代码
On Error Resume Next ’程序容错设计
outstring(0) = "&H03"’读取命令格式
r: MSComm1.Output = outstring
Call DelaySet(0.1)
Call Receive
Do While Left(receiveData, 2) <>"06"’如果左边2位值不是06 说明数据有错误,重新读入
DoEvents ’防止死循环
GoTo r
Loop
(5)十六进制转十进制代码
由于仪器发送和读取的都是16进制代码,因此在读入后需要进行格式转换才能供数据处理使用。
Public Function CHex(H)As Double ’十六进制转换十进制换算公式Dim Hv, Dv, d, m
H = UCase(H)
For m = 1 To Len(H)
Hv = Left(Right(H, m), 1)
Select Case Hv
Case "A": Dv = 10
Case "B": Dv = 11
Case "C": Dv = 12
Case "D": Dv = 13
Case "E": Dv = 14
Case "F": Dv = 15
Case Else: Dv = Hv
End Select
d = d + (Dv * (16 ^ (m - 1)))
Next
CHex = d
End Function
(6)延时控制代码
在控制中,为了给仪器接收控制命令后有相应的数据准备时间,故设置了系统延时程序。
Private Sub DelaySet(Lapse As Single) ’延时程序,以秒为单位
Oldtimer = Timer
Do
DoEvents
TimeDiff = Timer - Oldtimer
If TimeDiff < 0 Then TimeDiff = TimeDiff + 86400
If TimeDiff > Lapse Then Exit Do
Loop
End Sub