VB6 : Brauche Hilfe bei Anbindung zur seriellen Schnittstelle (MSComm)

andree112

Grünschnabel
Hallo Zusammen,

ich komme bei einem Problem nicht weiter.
Ich habe ein Gerät (EC Cash Gerät) und möchte dies, über seriell, an mein VB Programm anbinden. Das Problem ist, das das Gerät immer innerhalb von 500 ms eine Antwort vom Computer fordert, sonst gibt es eine Fehlermeldung heraus.
Die Kommandos bestehen aus verschieden langen HEX Zeichen. Sie fangen immer mit 10 02 an und hören immer mit 03 ( ist CRC Prüfsumme) auf.
Ich habe es einfach so gemacht, das ich im OnComm Ereigniss jedes einzelnes Zeichen abfange und solbald ein definiertes Zeichen kommt sende ich die definierte Antwort.

Private Sub MSComm1_OnComm()


'ted1 = Hex(Asc(MSComm1.Input))
'If ted1 = 15 Then
'MsgBox "Es ist ein Fehler bei der Kommunikation aufgetreten !", vbCritical, "EC Cash"
'Exit Sub
'End If





'If ted1 = "33" Then
'MSComm1.Output = Chr(6)
'MSComm1.Output = Chr(16) + Chr(2) + Chr(128) + Chr(0) + Chr(0) + Chr(16) + Chr(3) + Chr(245) + Chr(31)
'End If

'If ted1 = "1F" Then
'MSComm1.Output = Chr(6)
'End If

'If ted1 = "7D" Then
'MSComm1.Output = Chr(6)
'MSComm1.Output = Chr(16) + Chr(2) + Chr(128) + Chr(0) + Chr(0) + Chr(16) + Chr(3) + Chr(245) + Chr(31)
'End If

'If ted1 = "F2" Then
'MSComm1.Output = Chr(6)
'MSComm1.Output = Chr(16) + Chr(2) + Chr(128) + Chr(0) + Chr(0) + Chr(16) + Chr(3) + Chr(245) + Chr(31)
'End If
'End Sub



Dies hat auch soweit funktioniert, aber es gibt halt das Problem, das es Kommandos gibt die als letztes Zeichen zwar die gleichen haben, aber die vorhergehenden anders sind. (CRC Prüfsumme)
Nun habe ich versucht immer alle Zeichen in einer Buffer$ zu speichern und dann immer mit einem String zu vergleichen, sobald der richtige String komplett ist soll er dann die Antwort senden. Dies hat aber nicht geklappt, weil das Programm dazu scheinbar zu langsam arbeitet.
Als weiterer Nachteil der ersten Lösung ist, das ich aus einem String Werte herauslesen möchte um die weiter zu bearbeiten. Wenn ich aber immer nur auf ein Zeichen reagiere habe ich den kompletten String nicht zur verfügung.

Als letzten Weg habe ich mir überlegt, das ich einfach eine Anforderung sende, und dann mit einer DO UNTIL LOOP Schleife darauf warte bis die Antwort kommt.

MSComm1.Output = Chr(16) + Chr(2) + Chr(6) + Chr(0) + Chr(4) + Chr(0) + Chr(0) + Chr(0) + Chr(252) + Chr(16) + Chr(3) + Chr(LB) + Chr(HB)

Do
DoEvents
buffer$ = buffer$ & MSComm1.Input
Loop Until InStr(Hex(Asc(buffer$)), "0610028000001003F51F" & vbCrLf)
.
MSComm1.Output = Chr(6)
buffer$ = ""
buffer$ = buffer$ & MSComm1.Input
Do
DoEvents
Loop Until InStr(Hex(Asc(buffer$)), "1002060F001003C633" & vbCrLf)
MSComm1.Output = Chr(6)
MSComm1.Output = Chr(16) + Chr(2) + Chr(128) + Chr(0) + Chr(0) + Chr(16) + Chr(3) + Chr(245) + Chr(31)

MSComm1.PortOpen = False


Selbst das hat nicht funktioniert.

Vielleicht hat jemand von euch eine Idee wie das funktionieren könnte. Mit Beispiel währe super.

PS: Es ist nicht einfach mein Problem zu beschreiben, falls Ihr eine Frage habt einfach antworten. Was noch dazu kommt, das ich noch nicht soviel Erfahrung im programmieren habe.

PPS: Falls jemand von euch Fragen zur Programmierung von der Schnittstelle allgemein hat kann mir die gerne Stellen. Die Schnittstelle heißt im Fachbegriff ZVT Schnittstelle.
 
Hallo andree,

sitze gerade vor dem selben Problem. Ich weiß, dein Beitrag ist schon etwas älter aber ich versuche es trotzdem.
Hast du das Problem lösen können? Ich bin soweit, dass ich Daten erfolgreich an das Terminal senden kann, aber habe Probleme bei dem auslesen der Antwort.
Ich erwarte einen Wert, der z.B. so aussieht:
0610028000001003F5F1
erhalte allerdings immer nur 10F1.
Hast du oder jemand anders eine Lösung dafür?

Hier mein Quellcode zum auslesen der Antwort:
Code:
Private Sub MSComm1_OnComm()
    Dim antwort As String

    antwort = Hex(Asc(MSComm1.Input))
    Text1.Text = Text1.Text & " " & antwort

    If antwort = "15" Then
        'MsgBox "Es ist ein Fehler bei der Kommunikation aufgetreten !", vbCritical, "EC Cash"
        'Exit Sub
    End If


    If antwort = "1F" Then
        MSComm1.Output = Chr(6)
    End If

End Sub

Wobei das mir nur bedingt weiterhilft.

Gruß, marv100
 
Zurück