Zum Inhalt springen

Vb .Net ComPort Daten werden beim lesen nicht vollständig angezeigt


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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.

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...