Guten Morgen liebe Experten!
Ich muss mich mal mit einem Visual-Basic 2010 Problem an euch wenden.
Ich möchte Messwerte von der seriellen Schnittstelle auf den PC
übertragen und sie dort weiterverrbeiten. Aber ich weiß nicht so recht,
wie ich es am besten anstelle.
Ich habe noch nicht so viel mit VB2010 gearbeitet, daher habe ich mir
erstmal ein Buch zugelegt, um einen Einstieg zu erleichtern. Das habe
ich auch schon soweit durchgearbeitet und denke, ich komme bis jetzt
ganz gut zurecht.
Also habe ich mir ein Programm geschrieben, welches die serielle
Schnittstelle öffnet und auch Daten senden und empfangen kann. Doch
jetzt gibt es zwei Möglichkeiten, die serielle Schnittstelle abzufragen:
1) Mittels Timer, der in Intervallen den Empfangspuffer abfragt und die
Daten in eine Variable kopiert, oder
2) Mittels
1
Private Sub sp_SerialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles sp_SerialPort.DataReceived
was ja scheinbar bei jedem empfangenen Zeichen aufgerufen wird.
Was ist hier nun besser? Ich weiß auch nicht genau, wie es am besten
weitergeht. Ich habe also eine Variable, einen String, an dem ich alle
neuen Daten mit
anhängen kann. (Ich komme aus der C-Programmierung, da ist es für mich
schon etwas ungewöhnlich, dass der String beliebig länger werden kann,
ohne dass ich dem Puffer eine feste Länge zuordnen muss)
Aus diesem String möchte ich ja jetzt Datensätze extrahieren. Ein
Datensatz besteht z.B. aus
1
U1293\n\r
für 1293mV oder
1
T24.7\n\r
für 24,7°C. Diese Messwerte möchte ich jetzt halt in einem extra
Fenster anzeigen. Aber wie hole ich das jetzt am besten aus dem String
raus?
Der String kann ja z.B. sein:
1
"XXXU1293\n\rT24.7\n\rXXXXXXU23X\rXTX4.7\n\r
Da wäre jetzt ein korrekter Datensatz drin, aber auch Müllwerte (kann ja
mal vorkommen) - ich möchte natürlich nur die "guten" Werte haben.
Nachdem ich den Wert aus dem String herausgeholt habe, sollte die Daten
natürlich auch wieder gelöscht werden, damit der String nicht unendlich
lang wird.
Soviel erstmal zu meinem Vorhaben - ich würde mich über ein paar
Denkanstöße freuen.
Und noch was anderes: Wie mache ich eine korrekte Abfrage nach dem
Inhalt eines Strings, der ein "," enthält, das klappt bei mir nicht. Die
Abfrage:
Bernd schrieb:> 1) Mittels Timer, der in Intervallen den Empfangspuffer abfragt und die> Daten in eine Variable kopiert, oder
nein das auf jeden Fall nicht.
> 2) MittelsPrivate Sub sp_SerialPort_DataReceived(ByVal sender As Object, ByVal e
As System.IO.Ports.SerialDataReceivedEventArgs) Handles sp_SerialPort.DataReceived
> was ja scheinbar bei jedem empfangenen Zeichen aufgerufen wird.
wird nicht bei jeden Zeichen aufgerufen, es können auch mal mehre
zeichen auf einmal ankommen
> Was ist hier nun besser? Ich weiß auch nicht genau, wie es am besten> weitergeht. Ich habe also eine Variable, einen String, an dem ich alle> neuen Daten mitStrInputValue = StrInputValue & sp_SerialPort.ReadExisting> anhängen kann. (Ich komme aus der C-Programmierung, da ist es für mich> schon etwas ungewöhnlich, dass der String beliebig länger werden kann,> ohne dass ich dem Puffer eine feste Länge zuordnen muss)
warum machst du dann vb? Ich würde zu C# Raten das ist vom Syntax viel
näher an C dran.
Bernd schrieb:> Und noch was anderes: Wie mache ich eine korrekte Abfrage nach dem> Inhalt eines Strings, der ein "," enthält, das klappt bei mir nicht. Die> Abfrage:ElseIf cbo_StopBits.Text = "1,5" Then> sp_SerialPort.StopBits = IO.Ports.StopBits.OnePointFive> funktioniert nicht. Die 1,5 stehen halt in einer ComboBox und können vom> User ausgewählt werden.
doch macht man so Strings, werden mit = verglichen. Vermutlich steht
also etwas anders drin.
Man Trennt aber sowieso Daten und Text. Es ist immer eine schlechte Idee
so einen Text direkt zu verwenden.
Peter II schrieb:> wird nicht bei jeden Zeichen aufgerufen, es können auch mal mehre> zeichen auf einmal ankommen
Was heißt "auf einmal"? Was in dem Buch leider fehlt, ist eine Sektion
über die RS232 ;-\ Daher weiß ich auch nicht, wann der Handler genau
aufgerufen wird.
Peter II schrieb:> nein das auf jeden Fall nicht.
So wurde es halt in den meisten Internet-Videos gemacht. Ich habe es
erst auch so gehabt, bin aber jetzt auf den Empfangshandler umgestiegen.
Peter II schrieb:> warum machst du dann vb?
Wollte ich jetzt auch mal kennenlernen.
Peter II schrieb:> doch macht man so Strings, werden mit = verglichen.
Sorry, was meinst du damit?
Peter II schrieb:> Vermutlich steht> also etwas anders drin.
Nee, steht 1,5 drin.
Peter II schrieb:> Man Trennt aber sowieso Daten und Text. Es ist immer eine schlechte Idee> so einen Text direkt zu verwenden.
Was heißt direkt zu verwenden? Ich frage doch nur den aktuellen in der
cbo stehenden Text ab, welcher vom Benutzer auch icht verändert werden
kann. Ist eine nicht-modifizierbare Auswahlliste.
Bernd schrieb:> So wurde es halt in den meisten Internet-Videos gemacht.
vergiss irgendwelche Vidos - da kann man doch nichts lernen. Es gibt
aureichend Doku zu .net im netzt - video ist dafür (wie ich finde) das
schlechteste Format um soetwas zu lernen.
> Was heißt "auf einmal"? Was in dem Buch leider fehlt, ist eine Sektion> über die RS232 ;-\ Daher weiß ich auch nicht, wann der Handler genau> aufgerufen wird.
das das system intern ein paar zeichen puffert und dann erste den Event
ausruft. Damit bekommt du mehere Zeichen auf einmal.
Bernd schrieb:>> warum machst du dann vb?> Wollte ich jetzt auch mal kennenlernen.
wenn du C# noch nicht kennst, dann lerne das kennen.
Peter II schrieb:
> > doch macht man so Strings, werden mit = verglichen.> Sorry, was meinst du damit?
das dein code richig ist. So wird es gemacht.
> Nee, steht 1,5 drin.
glaube ich nicht, sonst würde das if ja funktionieren.
> > Man Trennt aber sowieso Daten und Text. Es ist immer eine> > schlechte >Idee> > so einen Text direkt zu verwenden.> Was heißt direkt zu verwenden? Ich frage doch nur den aktuellen in der> cbo stehenden Text ab, welcher vom Benutzer auch icht verändert werden> kann. Ist eine nicht-modifizierbare Auswahlliste.
und wenn du den code mal in englisch machen willst und dann 1.5 in der
Box steht was macht du dann? Oder Chinesisch?
Das ist der Grund warum man immer zu dem Text auch einen Internen Wert
ablegt, dann kann man den Text ändert ohne das es eine auswirkung hat.
Peter II schrieb:> das das system intern ein paar zeichen puffert und dann erste den Event> ausruft. Damit bekommt du mehere Zeichen auf einmal.
Achso, das ist der Treshhold den ich einstellen kann, würde ich jetzt
mal so in den Raum werfen.
Peter II schrieb:> glaube ich nicht, sonst würde das if ja funktionieren.
Doch leider schon :-\ Habe den Text ("1,5") jetzt nochmal aus der
ComboBox in den Quelltext kopiert, das läuft nicht.
Peter II schrieb:> Das ist der Grund warum man immer zu dem Text auch einen Internen Wert> ablegt, dann kann man den Text ändert ohne das es eine auswirkung hat.
OK, aber dann weiß ich nicht, nach was ich in der Box abfragen soll,
denn so wurde es auch im Buch beschrieben.
Bernd schrieb:> Doch leider schon :-\ Habe den Text ("1,5") jetzt nochmal aus der> ComboBox in den Quelltext kopiert, das läuft nicht.
dann teste doch einfach
if "1,5" = "1,5"
und du wirst sehen das es geht.
Eine eigene Frage?
Dieser Thread ist über 14 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.