obd控制协议程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
系统部分功能程序的实现
(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