mirmi Geschrieben 12. März 2005 Geschrieben 12. März 2005 Hallo Bin heute zufällig bei der verzweifelten Suche nach Hilfe auf Euer Forum gestossen ... Habe ein Gerät an einem Com Port hängen. In meinem Prog hab ich ein Frame mit Einigen Buttons und einer TextBox um den Port zu testen und abzufragen. Mit einfachen Befehlen (2 Zeichen) erreiche ich die Ausgabe von bestimmten Werten, die dann im Prog weiterverabeitet werden müssen. Getrennt werden die Zeichenpackete durch ControlChars.CrLf. Leider kommen die Daten (im Vergleich zum Hyperterinal - da funzts) "abgeschnitten" an. Ich versuchs zu Beschreiben: Das trennen der Daten nach funktioniert schon. Und meistens (leider nicht immer) bekomm ich auch die richtige Antwort. Bei der Antwort wird nie mehr der Anfang der Ausgabe abgeschnipselt, sondern am Ende fehlen ein paar Zeichen... Manchmal muss ich öfter klicken um überhaupt Antwort zu erhalten. Die Anzahl der fehlenden Zeichen variiert und bei weiteren Klicks (also Befehl senden) kommt dann wieder das richtige raus. Das sieht so aus: Vollständige Ausgabe (Beispiel): ID 21845 BR 85 AN 85 PE 85 Unvollständige Ausgabe (Beispiel): ID 21845 BR 85 AN 85 P Antworten mit 2 Zeichen stellen weiterhin kein Problem dar, und werden sofort nach dem Senden des Befehls angezeigt (z.B. OK). Ein weiteres Problem stellt eine bestimmte Ausgabe dar. Sie sieht so aus (aus dem Hyperterminal kopiert): B1 744 B2 819 B3 1023 B4 630 B5 682 B6 1170 LX 9550 TR 600 Diese Ausgabe kann mein Prog überhaupt nicht darstellen. Mir kommt irgendwie vor, das es entweder Befehle nicht abschickt, oder irgendwelche Timeouts beim Empfanden voreingestellt sind. Das Gerät schickt die Antworten sicher gleich weg. Wo gehen die denn verloren?!? Irgendwie reagiert mein Prog nicht so schnell wie zB das Hyperterminal. Da muss ich nie einen Befehl 2x oder öfter schicken damit er gehört wird... Die InBufferSize-Eigenschaft des ComControl ist auf 1024 eingestellt. Das sollte wohl reichen... Gibt es Timouts, die das ComControl voreingestellt hat? Unten hab ich noch den Code der der OnComm Prozedur angehängt. Ich hoffe jemand von Euch kann mir hier weiterhelfen... Danke schonmal vorab mirmi Anbei noch der Code: Select Case comcom.CommEvent Case 1006 MsgBox("Datenverlust!") Case 1008 MsgBox("Datenverlust!") Case 2 Dim strTexttest As String strTexttest = strTexttest & comcom.Input Dim arrText() As String = strTexttest.Split(ControlChars.Cr) Select Case Microsoft.VisualBasic.Left(arrText(0), 2) Case "MM" txtOutput.Text = arrText(0) & ControlChars.CrLf & arrText(1) Case "ID" txtOutput.Text = arrText(0) & ControlChars.CrLf & arrText(1) & ControlChars.CrLf & arrText(2) & ControlChars.CrLf & arrText(3) Case "OK" txtOutput.Text = arrText(0) Case "B1" txtOutput.Text = arrText(0) & ControlChars.CrLf & arrText(1) & ControlChars.CrLf & arrText(2) & ControlChars.CrLf & arrText(3) & _ ControlChars.CrLf & arrText(4) & ControlChars.CrLf & arrText(5) & ControlChars.CrLf & arrText(6) & ControlChars.CrLf & arrText(7) Case "NM" txtOutput.Text = arrText(0) Case "BY" txtOutput.Text = arrText(0) End Select End Select Zitieren
Manfred.Becker Geschrieben 14. März 2005 Geschrieben 14. März 2005 Hi Mirmi, das Problem bei der OnComm Ereignis ist, dass es aufgerufen werden kann, obwohl noch garnicht alle Zeichen übertragen wurden. Damit kann es eben vorkommen, dass du Zeichen übersiehst, wenn du nicht in der OnComm Funktion danach schaust. Ich hatte das mal in VB so gemacht: Private Sub MSComm1_OnComm() Dim ReceiveData(1024) As Integer Dim BytesLeft As Integer Dim i As Integer Dim nBytes As Integer Dim ch As Byte Dim strIn As String nBytes = 0 BytesLeft = MSComm1.InBufferCount Do While BytesLeft > 0 strIn = MSComm1.Input nBytes = nBytes + 1 If strIn <> "" Then ReceiveData(nBytes) = AscB(strIn) Else ReceiveData(nBytes) = 0 End If DoEvents BytesLeft = MSComm1.InBufferCount Loop strIn = "" For i = 1 To nBytes ch = ReceiveData(i) Select Case ch Case 0 To 31 If optData(0).Value = True Then strIn = strIn & "[" & ch & "]" ElseIf optData(1).Value = True Then strIn = strIn & "[" & Hex(ch) & "]" Else strIn = strIn & "." End If Case 32 To 255 strIn = strIn & Chr(ch) End Select Next i If strIn <> "" Then Call lstData.AddItem(Time$ & " Recv: " & strIn, 0) End If End Sub [/PHP] OK, das Beispiel ist jetzt nicht das was du brauchst, und es ist nur VB-Code, aber zwei wichtige Dinge sind zu erkennen: 1.) Die Prüfung ob's noch Zeichen gibt 2.) Das Ergebnis ist eine Zusammensetzung der einzelnen Input Daten. Ausserdem ist wichtig, die InBufferSize-Eigenschaft auf 1 zu setzen. Dadurch ist sichergestellt, dass selbst wenn nur ein Zeichen ankommt, das Ereignis ausgelöst wird. Zitieren
mirmi Geschrieben 19. März 2005 Autor Geschrieben 19. März 2005 Danke Manfred, für Deine Antwort Habs ein bischen umständlicher, mit 3 Prozeduren gelöst .... Beim empfangen wird der Output Buffer an eine Prozdur übergeben: strOutput = strOutput & comcom.Input IncomeData(strOutput) Die Prozedur stellt die Position des ersten ControlChars.Cr fest und gibt die Zeichen bis zum ersten ControlChars.Cr an die Prozedur weiter, die dann die Antworten für das Prog verabeitet (zB. belegen von Variablen) Sieht so aus: Private Sub IncomeData(ByVal data As String) 'Buffer füllen IncomeBuffer &= data 'Sehen ob Buffer voll genug ist. If IncomeBuffer.IndexOf(ControlChars.Cr) > -1 Then Do Dim IncomePos As Integer = IncomeBuffer.IndexOf(ControlChars.Cr) 'Gibte es kompletten Token? If IncomePos > -1 Then EvalData(IncomeBuffer.Substring(0, IncomePos)) IncomeBuffer = IncomeBuffer.Substring(IncomePos + 1) Else 'alle Tokens abgearbeitet. Exit Do End If Loop End If End Sub Das passiert solange, bis der Buffer abgeabeitet ist. Grüße mirmi Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.