Autor |
Beitrag |
bZzR
      
Beiträge: 17
|
Verfasst: Mo 10.10.11 17:57
hallo...
ich bin so richtig am verzweifeln...
von einer Wetterstation wird mir per SerialPort einzeln nacheinander alle 2sek folgende zeichen zugeschickt
P1017T25.5H38.8 .....
P=Druck
T=Temperatur
H=Luftfeuchtigkeit
ich kann mir auch den code anders zuschicken lassen, was am besten passt
ich muss diese zeichenreihe einlesen und splitten und denn den richtigen textboxen zuweisen
ich habe schon einiges versucht..aber es scheitert immer
vllt ist einer so nett und kann mir da schon mal weiterhelfen
VIELEN DANK
Moderiert von Th69: Beitragsformatierung überarbeitet: Leerzeilen entfernt
Moderiert von Th69: Titel geändert.
|
|
bZzR 
      
Beiträge: 17
|
Verfasst: Mo 10.10.11 18:43
also die zeichen kommen ja einzeln an. also die erst im stringbuilder adden. denn den anfangsbuchtaben nach aufteilen un den texboxen zuweisen
|
|
daeve
      
Beiträge: 116
Erhaltene Danke: 3
Windows (XP Pro, 7 Ultimate x64)
C#,WPF,Java,ASP.Net, VS 2010 Ultimate (x86)
|
Verfasst: Mo 10.10.11 18:43
was geht denn nicht ? das zuweisen der TextBox oder das splitten des Strings.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7:
| string meinString = "Schweiz,Italien,Polen"; string[] meineStrings = meinString.Split(new Char[] { ',' });
|
|
|
bZzR 
      
Beiträge: 17
|
Verfasst: Mo 10.10.11 19:21
ja so einfach ist das leider nicht..
letztens hatte ich es mit diesem code ausprobiert
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| StringBuilder builderPressure = new StringBuilder(); StringBuilder builderHumidity = new StringBuilder(); StringBuilder builderTemp = new StringBuilder();
string start = serialPort1.ReadExisting();
if (start == "T") { while (builderTemp.Length < 4) { builderTemp.Append(serialPort1.ReadExisting()); }
textBoxTemp.Text = builderTemp.ToString(); }
if (start == "P") { while (builderPressure.Length < 4) { builderPressure.Append(serialPort1.ReadExisting()); }
textBoxPressure.Text = builderPressure.ToString(); }
if (start == "H") { while (builderHumidity.Length < 4) { builderHumidity.Append(serialPort1.ReadExisting()); }
textBoxFeucht.Text = builderHumidity.ToString(); } |
Zuerst wird mit einer If Abfrage überpürft um welchen Wert es sich handelt.
Denn wird in den Stringbuilder die 4 Ziffern geladen und denn denn an der Textbox angezeigt.
Das funktioniert sogar. Nur manchmal wird ein T am Ende in der Textbox für Luftdruck mit reingeladen, also sogar 5 Ziffern...
Und mein Code ist leider längenabhängig... immer bei 4 Zeichen
So und aktuell habs ich mich mit regex eingelesen...
Moderiert von Th69: Beitragsformatierung überarbeitet: Leerzeilen entfernt.
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 11.10.11 10:34
Hallo bZzR,
du hättest ruhig dazuschreiben können, daß du diese Anfrage schon mal bei myCSharp.de unter www.mycsharp.de/wbb2...d.php?threadid=98703 gepostet hattest.
Und zu deinem Code:
mit der SerialPort.ReadExisting-Methode liest du ja nicht nur 1 Zeichen, sondern so viele wie gerade im Puffer anliegen.
Um nur genau 1 Zeichen zu lesen, benutze eine der anderen Read-Methode z.B. ReadByte oder ReadChar. Kriegst du denn ein NewLine-Zeichen am Ende jeder Zeile, dann könntest du auch die ReadLine oder ReadTo-Methode benutzen?
Und sind die Zahlenwerte denn immer genau 4 Zeichen lang? Denn dies wurde ja auch schon im anderen Thread nachgefragt, aber von dir nicht eindeutig beantwortet...
|
|
papa69
      
Beiträge: 79
Erhaltene Danke: 23
Win 10, Ubuntu
C#, Java, C
|
Verfasst: Di 11.10.11 14:00
hallo bZzR,
wenn ich dich richtig verstehe, liest du alle 2 Sek. einen String der Länge 15 ein.
Dann bilde doch einfach Substrings, die du den jeweiligen Textboxen zuweist...
C#-Quelltext 1: 2: 3: 4: 5: 6:
| StringBuilder buildString = new StringBuilder();
textBoxTemp.Text = buildString.Substring(6, 9); textBoxPressure.Text = buildString.Substring(1, 5); textBoxFeucht.Text = builderString.Substring(11, 15); |
dabei gehe ich davon aus, das nach 2 Sek. der Datenpuffer ausgelesen ist und danach wieder "leer" ist
_________________ Daniel Bauer
... fatal ist nur, wenn sich das Licht am Ende des Tunnels als entgegenkommender ICE entpuppt ...
|
|
Dr. Hallo
      
Beiträge: 110
Erhaltene Danke: 13
XP
C/C++/C#
|
Verfasst: Di 11.10.11 17:33
Zitat: | So und aktuell habs ich mich mit regex eingelesen... |
so, heißt das Du hast das Problem gelöst?^^
falls Empfangseinheit immer gleich ist dann Du so machen..
C#-Quelltext 1: 2:
| char[] separators = new char[] {'H', 'P', 'T'} string[] arr = text.Split(separators); |
Moderiert von Th69: C#-Tags hinzugefügt
|
|
bZzR 
      
Beiträge: 17
|
Verfasst: Mi 12.10.11 16:42
hallo
@Th69.. sry, ja hatte es gepostet aber wurder geschlossen und keine große hilfe war es für mich da.
die anderen read methoden hat ich auch schon mal ausprobiert und führten immer zu fehlern, werde es aber nacher nochmal alles antesten
die zahlenwerte sind nicht immer gleich leider... ich kann mir aber den code noch anders schicken lassen.. zb für Temp A12.3B .... Druck C1234D ... usw
@papa69.. alle 2 sek schicke ich per timer einen string mit "getAll"
C#-Quelltext 1: 2: 3: 4: 5: 6: 7:
| private void timer1_Tick(object sender, EventArgs e) { if (serialPort1.IsOpen) { serialPort1.Write("getAll"); } } |
und danach wird mir nacheinander zeichen für zeichen ohne enter der code rübergeschickt. denn ich denn auswerten muss. also leer ist der datenbuffer ja nicht direkt. ich lese halt mit der read methode aus und packe es in einen string(builder)
@Dr.Hallo... das problem ist leider nicht gelöst^^ die regex methode wurde mir vorgeschlagen. hab ich mich 4 std mit beschäftigt, aber ist ja nur nen filter für einen string. empfangseinheit ist leider nicht immer gleich(lang)
also ich habe meinen serialPort1 den ich mit der Methode ReadExisting()auslese ... das muss ich ja irgendwie in einen string alles packen was ankommt und es den textboxen zuweisen
Viele Dank schon mal an euch  ..
Moderiert von Th69: Beitragsformatierung überarbeitet.
|
|
bZzR 
      
Beiträge: 17
|
Verfasst: Mi 12.10.11 18:38
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| StringBuilder builderTemp = new StringBuilder();
string start = serialPort1.ReadExisting();
if (start == "T") { while (builderTemp.ToString() == "H") { builderTemp.Append(serialPort1.ReadExisting()); }
textBoxTemp.Text = builderTemp.ToString(); } |
Ich bin mit dieser Auslese-Methode schon ganz gut gefahren. Nur bin ja immer aus der While-Schleife gegangen wenn die Anzahl der Zeichen auf 4 gekommen ist, was ja leider nicht immer der Fall ist.
Kann man da nicht einfach einsetzen das er bei H aus der Schleife kommt und das vorhanden in die Textbox schiebt... also zB bei T12.4H
Moderiert von Th69: Beitragsformatierung überarbeitet.
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 12.10.11 18:59
Sorry bZzR,
aber ich habe dir doch schon geschrieben, daß ReadExisting die falsche Methode für deine Zwecke ist.
Irgendwie muß aber die Gegenseite (d.h. der Sender) doch so eingestellt werden können, daß du erkennen kannst, wann die Daten komplett da sind (also entweder vorher die Länge mit übertragen oder aber eine konstante Länge oder aber ein Endezeichen).
Wenn du nicht ein bißchen mehr Eigeninitiative zeigst (weil der Thread dreht sich hier ja im Kreise), werde ich ihn wohl schließen müssen.
|
|
bZzR 
      
Beiträge: 17
|
Verfasst: Mi 12.10.11 19:06
hey.. bitte nicht schließen
ich bin jetzt schon wieder nen paar stunden dabei..
ich habe leider die wetterstation nicht bei mir sondern das ist der part von nen anderen klassenkamerad
ich simulier diese immmer mit einen terminal und virtualserialport und schicke mir einzelene zeichen zu
die länge wird nicht mitgesendet aber halt diese
code-form
P1017T25.5H38.8 P1017T25.5H39.1 P1017T2...
also ich kann ihm sagen der er zB als endzeichen ein "E" senden soll .. somit wäre Start bei "P" und Ende bei "E"
P1017T25.5H38.8E
Druck zwischen den Zeichen P und T
Temp zwischen den Zeichen T und H
Feucht zwischen den Zeichen H und E
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 12.10.11 19:27
Hallo,
ja das mit dem Endezeichen 'E' wäre doch super, weil dann kannst du einfach
C#-Quelltext 1:
| string line = serialPort.ReadTo("E"); |
benutzen (oder aber jeden Teilstring entsprechend).
Laut englischer MSDN SerialPort.ReadTo wird das Endezeichen nicht im String zurückgegeben (aber intern aus dem Puffer gelöscht).
Und wenn du dann den oder die Strings hast, kannst du einfach mittels String.Substring die einzelnen Zahlenwerte in den TextBoxen anzeigen (oder aber die Variante von "Dr. Hallo" mittels String.Split benutzen).
Schau aber jetzt ersteinmal, ob du die Zeilen vernünftig ausgelesen bekommst.
|
|
bZzR 
      
Beiträge: 17
|
Verfasst: Mi 12.10.11 19:37
hey
das gar nicht mal so schlecht!! ich versuche nun es aufzusplitten und den textboxen zuzuweisen! ..war wohl zu einfach mitn readto("e") ;P
ich melde mich
dankeschön
|
|
bZzR 
      
Beiträge: 17
|
Verfasst: Mi 12.10.11 19:52
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| string werte = serialPort1.ReadTo("E");
char[] char1 = new char[] { 'H', 'P', 'T' }; string[] strings = werte.Split(char1);
textBoxTemp.Text = strings[0].ToString(); textBoxPressure.Text = strings[1].ToString(); textBoxHumidity.Text = strings[2].ToString(); |
So sieht nun mein Code aus. Mitn Terminal simuliert scheint das alles zu funktionieren. Später werd ich meinen Kumpel das Programm schicken um es zu testen
|
|
Th69
      

Beiträge: 4796
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 12.10.11 20:05
Schön, daß es jetzt (endlich ;-) funktioniert.
Und in nur wenigen Zeilen...
P.S. Auf das .ToString() kannst du verzichten, da es ja schon Strings im Array sind
|
|
bZzR 
      
Beiträge: 17
|
Verfasst: Mi 12.10.11 20:19
ich hoffe es klappt nacher auch in der praxis anwendung
echt voll wenig.. ich sitz da echt schon eininge wochen dran...
hehe stimmt.. tostring() hab ich rausgenomm, war wohl nen reflex ^^
|
|
bZzR 
      
Beiträge: 17
|
Verfasst: Fr 14.10.11 18:53
Hallo
Nun möchte ich ganz gerne die Werte in einem Textdokument abspeichern
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| StreamWriter myWriter = new StreamWriter(@"C:\Wetterstation_Aufzeichnung.txt");
myWriter.WriteLine(DateTime.Now + " Luftdruck = " + strings[0] + " hPa"); myWriter.WriteLine(DateTime.Now + " Temperatur = " + strings[1] + " C°"); myWriter.WriteLine(DateTime.Now + " Luftfeuchtigkeit = " + strings[2] + " %");
myWriter.Close(); |
Dies macht er auch ganz gut nur halt immer wieder wird es überschrieben und es befinden sich nur diese 3 werte im textdokument
Das liegt wohl daran das ich "myWriter" immer wieder neu erstelle und somit das textdokument überschreibe
Wenn ich aber nun den Streamwriter zB in Form1_Load erstelle kommt der fehler Der Name "myWriter" ist im aktuellen Kontext nicht vorhanden.

|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 14.10.11 19:04
Hallo!
Bitte erstelle für eine neue Frage auch einen neuen Thread. Dann kannst Du den Thread in der richtigen Sparte posten und ihm auch einen korrekten Titel geben, sodass der Thread besser gefunden werden kann. Danke Dir!
Grüße,
Christian
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|