系统部分功能程序的实现
(1)端口控制的实现
当打开检测界面时,上位机端口默认COM1打开,使用者需选择相应的端口,具体执行代码如下:
If MSComm1.PortOpen Then ’先关闭原打开的端口,以便重新打开新端口
MSComm1.PortOpen = False End If
MSComm1.CommPort = 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读取故障码
页脚内容
5
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)端口数据接收功能的实现
当向仪器端口发送相应的控制命令后,可以用下面的子程序实现对仪器响应的接收。
页脚内容
5
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\" ’读取命令格式
页脚内容
5
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
页脚内容
5
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
页脚内容
5
因篇幅问题不能全部显示,请点此查看更多更全内容