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.
Nenne uns doch einfach die eingestellte Bausrate. Quelltext ist hilfreich.
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.
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
Hallo, ein quelltext währe wirklich hilfreich. Was zeigt der Taskmanager an, welche CPU auslastung?
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.