Hej Testa att skriva Pause på detta sätt. Jag sprungit på ett annat problem med, jag måste låta programmet stanna, i 2 sekunder innan jag ändrar till baud rate 10400, så progarmmet hinner skicka 10 bit på baud 5 innan baud ändringen. Nu kan jag klart inte ditt problem i detalj. Men du får lägga upp en loop på lämpligt ställe som Nu Har jag löst mitt problem och fått igång OBD2 komunikationen med bilen.Paus mellan 2 code rader
Jag vill skicka 33h baud 5 på com 1
invänta 3 byte baud 10400
pausa 40ms
skicka F7h på com1 Baud 10400
Invänta CCh på com 1.Baud 10400
Hur pausar jag mellan dessa två rader.
Jag har testat sleep, men det verkar som om den pausar först då innan den skickar 33h.se code nedan
Detta är för att starta upp en komunikation med en bil på OBD2.
Jag vill sedan ha alla byte visade i hex i ett text fönster.
Kan någon detta?
Private Sub Command4_Click()
MSComm1.InBufferCount = 0
Dim ComDcb As DCB 'windows API type in w32comm.bas file
Dim ret As Long
SetBaudRate = False
' *** NOTE: PORT MUST BE OPEN FOR THIS FUNCTION TO WORK ***
'Need to get current state before setting new value
ret = GetCommState(MSComm1.CommID, ComDcb)
If ret = 0 Then
Err.Raise 1, "SetBaudRate", "Could not read current state of ISO port"
End If
'Modify baud rate from 9600 to 5
ComDcb.BaudRate = 5
ret = SetCommState(MSComm1.CommID, ComDcb)
MSComm1.Output = Chr(&H33)
ret = GetCommState(MSComm1.CommID, ComDcb)
If ret = 0 Then
Err.Raise 1, "SetBaudRate", "Could not read current state of ISO port"
End If
'Modify baud rate from 5 to 10400
ComDcb.BaudRate = 10400
ret = SetCommState(MSComm1.CommID, ComDcb)
Do
DoEvents
Loop Until MSComm1.InBufferCount = 3
Sleep (40)
MSComm1.Output = Chr(&HF7)
MSComm1.InBufferCount = 0
Do
DoEvents
Loop Until MSComm1.InBufferCount = 1
If MSComm1.Input = Chr(&HCC) Then
MsgBox "Comunication OK"
MSComm1.Output = Chr(&H4)
Else
MsgBox "No comunication"
End IfSv: Paus mellan 2 code rader
Sleep(40) byter du ut mot detta.
<code>
Private Declare Function GetTickCount& Lib "kernel32" ()
Dim halt As Long
'...........................
'............................
'.........................
'Modify baud rate from 5 to 10400
ComDcb.BaudRate = 10400
ret = SetCommState(MSComm1.CommID, ComDcb)
Do
halt = GetTickCount + 40
DoEvents
Loop Until MSComm1.InBufferCount = 3
Do until GetTickCount > halt
Loop
'Sleep (40)
MSComm1.Output = Chr(&HF7)
MSComm1.InBufferCount = 0
</code>Sv: Paus mellan 2 code rader
(1 startbit 8 bit information och 1 stopp bit)
MagnusSv:Paus mellan 2 code rader
ligger och snurra tills det kommer 8 bit i out.
Gör en Until vilkor och ha ett DoEvents mitt i Do LoopenSv: Paus mellan 2 code rader
Problemet var att VB/Windows inte klarar att skriva i 5 Baud helt rätt, bara läsa.
Det jag fick göra var att använda Break signaler, det blev så här.
Är det fler som skriver VB kod för komunikation för bilar, hör gärna av er.
Hur simpelt som helst (med facit i hand).
En lite fråga, något är fel i konverteringen till HEX 6A, blir 00, kan någon förklara varför?
Magnus
Private Sub Command6_Click()
If MSComm1.PortOpen = True Then
MsgBox "already open"
Else
MSComm1.Settings = "9600,n,8,1"
MSComm1.CommPort = 1
MSComm1.InputLen = 0
MSComm1.PortOpen = True
Dim ComDcb As DCB 'windows API type in w32comm.bas file
Dim ret As Long
SetBaudRate = False
' *** NOTE: PORT MUST BE OPEN FOR THIS FUNCTION TO WORK ***
ret = GetCommState(MSComm1.CommID, ComDcb)
If ret = 0 Then
Err.Raise 1, "SetBaudRate", "Could not read current state of ISO port"
End If
'Modify baud rate from 9600 to 5
ComDcb.BaudRate = 10400
ret = SetCommState(MSComm1.CommID, ComDcb)
End If
End Sub
Private Sub Command5_Click()
If MSComm1.PortOpen = False Then
MsgBox "Com 1 Not open"
Else
End If
'Send 0x33 at Baud 5 with brake command
' Set the Break condition.
'Start bit
MSComm1.Break = True
Sleep (198)
' Wait for the sleep to pass.
' Bit 0 and 1 to zero
MSComm1.Break = False
Sleep (396)
' Wait for the sleep to pass.
' Bit 2 and 3 to one
MSComm1.Break = True
Sleep (396)
' Wait for the sleep to pass.
' Bit 4 and 5 to zero
MSComm1.Break = False
Sleep (396)
' Wait for the sleep to pass.
' Bit 6 and 7 to one
MSComm1.Break = True
Sleep (396)
MSComm1.Break = False
Sleep (180)
' Wait for the Sleep to pass.
Dim txt As String
Dim bytes() As Byte
Dim i As Integer
' Display the bytes.
txt = MSComm1.Input
bytes = StrConv(txt, vbFromUnicode)
txt = ""
For i = LBound(bytes) To UBound(bytes)
txt = txt & Format$(Hex$(bytes(i)), "00") & " "
Next i
Text2.Text = Text2.Text + txt + vbNewLine
Sleep (200)
MSComm1.Output = Chr(&HF7)
Sleep (20) 'Sleep (25-50)
' Display the bytes.
txt = MSComm1.Input
bytes = StrConv(txt, vbFromUnicode)
txt = ""
For i = LBound(bytes) To UBound(bytes)
txt = txt & Format$(Hex$(bytes(i)), "00") & " "
Next i
Text2.Text = Text2.Text + txt + vbNewLine
Sleep (2000)
txt = MSComm1.Input
bytes = StrConv(txt, vbFromUnicode)
txt = ""
For i = LBound(bytes) To UBound(bytes)
txt = txt & Format$(Hex$(bytes(i)), "00") & " "
Next i
Text2.Text = Text2.Text + txt + vbNewLine
'Wait for sleep to pass
'Send
MSComm1.Output = Chr(&H68)
MSComm1.Output = Chr(&H6A)
MSComm1.Output = Chr(&HF1)
MSComm1.Output = Chr(&H1)
MSComm1.Output = Chr(&H0)
MSComm1.Output = Chr(&HC4)
Sleep (20)
' Display the bytes.
txt = MSComm1.Input
bytes = StrConv(txt, vbFromUnicode)
txt = ""
For i = LBound(bytes) To UBound(bytes)
txt = txt & Format$(Hex$(bytes(i)), "00") & " "
Next i
Text2.Text = Text2.Text + txt + vbNewLine