Forum: PC Hard- und Software VB2010 - serielle Schnittstelle auslesen - wie ist es am effektivsten?


von Bernd (Gast)


Lesenswert?

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
1
StrInputValue = 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)

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:
1
ElseIf cbo_StopBits.Text = "1,5" Then
2
  sp_SerialPort.StopBits = IO.Ports.StopBits.OnePointFive
3
...
funktioniert nicht. Die 1,5 stehen halt in einer ComboBox und können vom 
User ausgewählt werden.

Gruß und danke!

von Peter II (Gast)


Lesenswert?

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.

von Bernd (Gast)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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.

von Bernd (Gast)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

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.

von Sven H. (dsb_sven)


Lesenswert?

Lies mal diesen Thread durch: 
Beitrag "Com Port Rückgabe"

von Bernd (Gast)


Lesenswert?

Sven H. schrieb:
> Lies mal diesen Thread durch:

Jo, danke, das mache ich erstmal!

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.