Forum: PC-Programmierung VB2005 zu langsam beim Datenempfang vom MC (Seriellport)


von Celli W. (cell)


Lesenswert?

Also ich habe ein VB-Programm mit VB2005 geschrieben. Dieses soll viele 
Daten vom MC zur Verarbeitung / Auswertung empfangen. Die Übertragung 
über einen virtuellen Comport.

Epfangen tue ich die daten über eine Delegatesub Private Sub:
Deklaration:
Private Delegate Sub DelegateSub()
Private TextboxAktualisieren As New DelegateSub(AddressOf Wertübergabe)

Empfangsfunktionen:
Private Sub DatenEmpfangen(ByVal sender As Object, ByVal e As 
System.IO.Ports.SerialDataReceivedEventArgs) Handles 
comport.DataReceived
- in dieser Funktion lese ich den Comport mit "comport.ReadExisting()" 
aus und speichere den wert in einer Variable zwischen
- dann rufe ich mit "Me.Invoke(TextboxAktualisieren)" die funktion 
Wertübergabe() auf und kann dort den wert in der textbox ausgeben

Sendet der MC nun ein Paket von zB. 50 Bytes, so gehen einige Bytes 
verloren. Um dies zu verhindern, habe ich im MC nach jeden gesendeten 
Byte ein Delay von 20ms eingebaut. Dann gehen keine Bytes mehr verloren. 
Da dies die ganze Übertragung sehr verlangsamt, brauche ich nun 
umbedingt eine bessere / schnellere Lösung wo keine Bytes verloren 
gehen.

Ich arbeite noch nicht so lange mit VB und muss auch zugeben dass ich 
noch die sSache mit den DelegateSubs noch nicht so ganz verinnerlicht 
habe.

von Eddy C. (chrisi)


Lesenswert?

Nenne uns doch einfach die eingestellte Bausrate. Quelltext ist 
hilfreich.

von Eddy C. (chrisi)


Lesenswert?

s -> d ^^

von Peter (Gast)


Lesenswert?

also so langsam kann vb2005 nicht sein, die frage ist ob es sinn macht 
ständig "Me.Invoke(TextboxAktualisieren)" zu machen, das wird wohl das 
langsamste sein. Da sollte man schon die Daten ein wenig Buffern.

von Celli W. (cell)


Lesenswert?

Hm ja an das invoke hab ich au schon gedacht.
Habs auch schon mit Buffer probiert. ich habe die ankommenden bytes in 
ein array gespeichert und erst invooke uasführen lassen wenn ein neues 
startbyte (für nächste übertragung) ankam. klappte auch nicht

Baudrate ist momentan 19200. Aber das Problem trifft mit anderen Bauds 
genauso auf und wenn ich das delay einstelle dann tritt es nicht mehr 
auf (wenn ich sie nur anzeigen lasse). Da ich die bytes aber noch zu 
integer zusammenbauen muss, muss ich sie in ein array zwischenspeichern. 
tue ich dies, dann kommt er auch mit delay im mc wieder nich hinterher.

ich habs auch versucht handschake einzustellen. hat auch nicht geholfen. 
jedenfalls vermute ich dass das vbprogramm beim laufen die werte nicht 
schnell genug verarbeitet und daher welche verloren gehn.

Kann ich den comport auch auf eine andere weise auslesen und die Daten 
in ein Array speichern? oder habt ihr sowas schon gemacht und wie habt 
ihr es gelöst?


    Private Delegate Sub DelegateSub()
    Private TextboxAktualisieren As New DelegateSub(AddressOf 
Wertübergabe)

    Private Sub DatenEmpfangen(ByVal sender As Object, ByVal e As 
System.IO.Ports.SerialDataReceivedEventArgs) Handles 
comport.DataReceived
        Try
            Wert = comport.ReadExisting()

            Me.Invoke(TextboxAktualisieren)
        Catch ex As Exception
        End Try
    End Sub

bzw mit buffer:
   Private Sub DatenEmpfangen(ByVal sender As Object, ByVal e As 
System.IO.Ports.SerialDataReceivedEventArgs) Handles 
comport.DataReceived
        Try
            Wert = comport.ReadExisting()
            If Asc(Wert) = 255 And emfange = True Then
                emfange = False
                Me.Invoke(TextboxAktualisieren)
            Else
                emfange = True
                test= CInt(Asc(Wert))
                befehlsarray_empfang(befehlsarray_counter) = Asc(Wert)
                befehlsarray_counter = befehlsarray_counter + 1
            End If

            'Me.Invoke(TextboxAktualisieren)
        Catch ex As Exception
        End Try
    End Sub

    Sub Wertübergabe()
        Timer1.Enabled = False
        t_ausgabe.Text = t_ausgabe.Text & Asc(Wert) & ", "
    End Sub

von Peter (Gast)


Lesenswert?

Hallo,
ein quelltext währe wirklich hilfreich.

Was zeigt der Taskmanager an, welche CPU auslastung?

von Celli W. (cell)


Lesenswert?

CPU-Auslastung 75%
Prozesse VB + programm im debugmodus haben kaum prozessorlast.
also das programm lastet den cpu auch nicht aus. hab auch priorität des 
prozesses hoch gestellt und immernoch das gleiche problem.

Code hatte ich oben eingefügt

von Peter (Gast)


Lesenswert?

also 75% ist schon recht viel, sollte bei 5% oder so liegen.

Leider ist da ein wenig code - man sieht nicht welchen datentype wert 
hat.

von Celli W. (cell)


Lesenswert?

oh ich glaub ich hab das problem gefunden. ich habe damals programmiert 
das ich den port auslese und speichere ihn in einen string. :/und nicht 
byteweise... und lese nur das erste byte bei verarbeitung. wenn nun 
mehrere gelesen wurde, dann gehen die verloren.
ich  überprüfe das gleich.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.