mikrocontroller.net

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


Autor: Celli W. (cell)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Eddy Current (chrisi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nenne uns doch einfach die eingestellte Bausrate. Quelltext ist 
hilfreich.

Autor: Eddy Current (chrisi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
s -> d ^^

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Celli W. (cell)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ein quelltext währe wirklich hilfreich.

Was zeigt der Taskmanager an, welche CPU auslastung?

Autor: Celli W. (cell)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Celli W. (cell)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.