obd控制协议程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档