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.