Hallo Leute, ich versuche mich gerade in der C# Programmierung und habe ihr mal ein Problem. Ich Sende mit dem µC auf einer Usart alle 0,1 Sekunde meine Messwerte. Im Teminal Programm sieht das dann so aus. (4 Messwerte pro Zeile) 231 6.05 11.00 3045 231 6.05 11.00 3045 231 6.05 11.00 3045 231 6.05 11.00 3045 231 6.05 11.00 3045 231 6.05 11.00 3045 Wie bekomme ich diese Werte in Variablen in C# geschrieben? Wäre es nicht besser, wenn ich die Berechnungen der Messwerte erst in C# mache? Danke für Eure Hilfe Wolf100
Hmm funktionieren wird wohl beides. Einfacher wird es allerdings sein wenn du an den PC, bzw dein C# Programm, die reinen Byte Werte schickst und diese dann auf dem Rechner weiterverarbeitest. So kannst du dann die Bytes direkt in Variablen schreiben wenn du sie empfängst und dann die Umrechnungen erledingen. Dadurch dürfte dann ja auch der Code im Flash vom Mikrocontroller wieder ein wenig kleiner werden, was je nach Anwendung ja auch nicht so verkehrt ist. Ein kleines Protokoll solltest du dir evtl noch überlegen, und Puffer würd ich bei 0,1 s evtl auch mal vorsehen damit nix daneben geht.
Diese werte kannst du mit Convert.ToDouble(wert); konvertieren. ich hoffe hab dir geholfen wenn nicht beschreibe dein Problem genauer MFG
Ach, das geht ganz einfach. Du liest die Schnittstelle mit Deinem C#-Programm aus. In der Toolbox findest Du SerialPort, den ziehst Du Dir in das Form und nimmst die Einstellungen in der Entwurfsansicht vor. Jetzt braucht Du nur noch in Deinem Programm den serialPort öffnen & mit serialPort->ReadByte stehen Dir dann auch sofort Deine Messwerte zur Verfügung. http://msdn.microsoft.com/de-de/library/system.io.ports.serialport%28VS.80%29.aspx Viel Spaß, Tom.
Hallo Frederik, Dachte ich mir schon da die Umrechnung auf dem PC besser ist. Da ich mit C# erst beginne, kannst Du mir verraten wie ich das in C# anstellen könne. Wie meinst Du das mit dem Protokoll und dem Array? Gruß Wolf100
das geht ja schnell hier, :-) und wie trenne ich die Werte? Gruß Wolf100
Es kommt natürlich darauf an Wie du sie bekommst;) Wenn du sie in einen String Bekommst musst du einfach den String Mit dem Trennzeichen " " spliten das geht mit DeinString.Split(" "); Dann erhältst du einen array den du nur noch Konvertieren musst MFG
Wolf100 schrieb: > das geht ja schnell hier, :-) > > und wie trenne ich die Werte? > > Gruß Wolf100 Wenn sonst nichts dagegen spricht, kann man das auch durchaus wie oben lassen.
1 | string fromController = "231 6.05 11.00 3045"; |
2 | var splitStrings = fromController.Split(new Char[] { ' ' }, StringSplitOptions.None); |
3 | var results = new double[4]; |
4 | for (int i = 0; i < splitStrings.Length; i++) { |
5 | results[i] = Convert.ToDouble(splitStrings[i]); |
6 | }
|
z. B. String[] array = null; string Daten = "wert1 wert2 wert3"; array = Daten.Split(' '); for (int i = 0; i == array.Length; i++) { Convert.ToDouble(array[i]); }
Joa so gehts natürlich auch, ich rechne halt meist die Bytes am Rechner um, find ich einfacher und man kann fix ne kleines Protokoll mit reinbauen. Les dir mal die hier genannten Links durhc und schau dir mal das Galileo Open Book Visual C# an. Damit solltest du dann erstmal weiter kommen.
Danke an alle, werde mich mit Euren Tipps auseinandersetzten. Wenn ich noch Fragen habe würde ich mich noch mal melden. Gruß Wolf100
Hallo noch mal, leider bin ich hier noch keinen Schritt weiter:-( oder ich stelle mich zu D....f an. vielleicht kann mir ja einer noch mal unter die Arme greifen. Gruß Wolf100
Kannst du denn schon Daten empfangen? Wenn es damit Probleme gibt, besorge dir mal so ein USB-RS232 Teil und guck, ob du es hin bekommst dir selber Daten zu schicken. Dazu machst du folgendes: [1] - Neues WinForms Projekt [2] - Aus der ToolBox ein "SerialPort" in das Formular ziehen (nicht wundern, der erscheint nicht im Form selber sonden im unteren Bereich der IDE [3] - Den SerialPort im Eigenschaftenfenster konfigurieren (Baud Rate, Port...) [4] - Einen zweiten SerialPort ins Form ziehen und konfigurieren [5] - Doppelt auf das form klicken. Dann landest du in einer Funktion, die dann aufgerufen wird, wenn dein Formular geladen wurde [6] - Für jeden SerialPort rufst du die Funktion "Open()" auf [7] - Wieder in den Designer wechseln [8] - einen Serial Port auswählen [9] - Im Eigenschaftenfenster die Events auswählen (das mit dem Blitz) [10] - Doppelt auf "DataReceived" klicken [11] - Jetz landest du in der Funktion, die aufgerufen wird, wenn dein SerialPort Daten empfägnt. [12] - Daten in irgendeine Datenstrucktur schreiben. Array, Liste, Tabelle... enlose Möglichkeiten [13] - Die Daten auswerten
Sven H. schrieb: > [12] - Daten in irgendeine Datenstrucktur schreiben. Array, Liste, > Tabelle... enlose Möglichkeiten > [13] - Die Daten auswerten Und ehe du den Punkt 13 in Angriff nimmst, empfehle ich ganz dringend einen Punkt [11b] oder [12b] einzufügen: Die empfangenen Zeichen in einem String sammeln bis zum Zeilenende (der µC muss natürlich auch ein Zeilende schicken) und dann diesen String einfach nur auf der Oberfläche zb in einem Textfeld ausgeben lassen. Ziel des Ganzen ist es: * Kontrolle ob die Übertragung fehlerfrei funktioniert * gewinnen von Sicherheit wie man das alles benutzt * ein String mit einer komplett empfangenen Zeile ist auf Empfängerseite ein ausgezeichneter Ausgangspunkt um mit der Datenanalyse anzufangen * Übung, Übung, Übung
Vollkommen korrekt. Du weißt nämlich nie, wann genau der Event für DataReceived ausgelöst wird, bzw. wie viele Daten sich im Eingangspuffer befinden. Also Daten sammeln bis zu einem definierten Steuerzeichen (z.b. Zeielnumbruch) Problem dabei: Wenn du die rohen Sensordaten sendest könnte dein Steuerzeichen dabei sein. Es gilt also entweder eine unmögliche Kombination von Daten als Steuerzeichen zu benutzen oder ein Protokoll zu entwickeln, mit dem du die Daten überträgst. Z.B. es kommen immer 3 Byte für einen Wert oder so. Allerdings ist dabei das Problem, dass, wenn sich eine der beiden Seiten mal verzählen sollte, alles keinen Sinn mehr ergibt ;-)
Sven H. schrieb: > Problem dabei: Wenn du die rohen Sensordaten sendest könnte dein > Steuerzeichen dabei sein. Ich denke das Problem hat er ganz gut umschifft: > Ich Sende mit dem µC auf einer Usart alle 0,1 Sekunde meine Messwerte. > Im Teminal Programm sieht das dann so aus. (4 Messwerte pro Zeile) > > 231 6.05 11.00 3045 > 231 6.05 11.00 3045 > 231 6.05 11.00 3045 > 231 6.05 11.00 3045 > 231 6.05 11.00 3045 > 231 6.05 11.00 3045 Das sieht so schon ganz brauchbar aus. Am Zeileanfang würde ich mir noch ein Sonderzeichen/Buchstaben einbauen, ev. auch vor jedem Messwert, damit man für die Zukunft und Protokolländerungen gerüstet ist, aber im großen und ganzen ist das was er hat schon mal ein Ausgangspunkt. Jetzt muss er nur noch auf C# Seite aus dem empfangenen Zeichenstrom wieder Zeilen und Strings machen um das erste Teilziel zu erreichen.
Hallo noch mal, so die Messwerte habe ich jetzt mit Sonderzeichen versehen. ■231■6.05■11.00■3045◄ ■231■6.05■11.00■3045◄ ■231■6.05■11.00■3045◄ ■231■6.05■11.00■3045◄ ■231■6.05■11.00■3045◄ ■231■6.05■11.00■3045◄ das ist soweit auch klarr. Wie sollte das jetzt aber in C# aussehen? ich möchte die werte in einer Liste Array speicher so das ich 1Stunde = 3600Sek bei 10 Werten pro Sekunde = 36000 Zeilen und 4 Spalten erhalte. Das ganze soll dann Live angezeigt werden, sozusagen sollten 4 Variablen immer den aktuellen Messwert haben und wenn ich den µC abschalte sollte man die Werte in einer txt speichern können. Wie sollte das funktionieren? Bin in C# ein absoluter Anfänger. Danke Wolf100
Wolf100 schrieb: > Hallo noch mal, > so die Messwerte habe ich jetzt mit Sonderzeichen versehen. Du hast dir natürlich genau eines ausgesucht, welches Ärger verspricht :-) Was spricht dagegen, ein Zeichen zu nehmen, welches in den Daten nicht vorkommt? Richtig: Gar nichts. Es hätte allerdings den Vorteil, dass es dir bei jeglicher Stringverarbeitung nicht verloren geht, wenn du einfach ein reguläres Zeichen nimmst. A231 B6.05 C11.00 D3045 A231 B6.05 C11.00 D3045 A231 B6.05 C11.00 D3045 A231 B6.05 C11.00 D3045 A231 B6.05 C11.00 D3045 A231 B6.05 C11.00 D3045 > das ist soweit auch klarr. Denk ich nicht. Die Idee besteht darin, dass wenn du den kompletten String an den Leerzeichen in seine Einzelteile zerlegst und du zb den Text C56.0 erhältst, dann sagt dir das C da am Anfang, das es sich um deinen dritten Wert handelt (was immer der auch bedeutet). Sinnvollerweise nimmt man sich igendwelche Kürzel, die einen Bezug zum Messwert haben. Überträgst du Temperatur, Druck und Luftfeuchte, so könnte man zb D756.56 T23.8 F23.8 nehmen. D = diese Zahl ist der Druck T = diese Zahl ist die Temperatur F = diese Zahl ist die Luftfeuchte hast du dann dein Teilstring "F76.5" vorliegen, dann weißt du, das es sich bei diesem Wert um die Luftfeuchte handelt. > Wie sollte das jetzt aber in C# aussehen? Hast du schon eine Zeile komplett in einem String? Das ist dein erster Anlaufpunkt: Eine Zeile (egal was drinnen steht) in einem String > Bin in C# ein absoluter Anfänger. Dann kauf dir ein C# Buch. Ich kanns schon nicht mehr hören. Bin Anfänger, hab keine Literatur, weiß nichts über meine Programmiersprache, keine Grundlagen, will aber eine Kernkraftwerksteuerung bauen.
Karl heinz Buchegger schrieb: > Die empfangenen Zeichen in einem String sammeln bis zum Zeilenende (der > µC muss natürlich auch ein Zeilende schicken) und dann diesen String > einfach nur auf der Oberfläche zb in einem Textfeld ausgeben lassen. Dabei das Invoke nicht vergessen, sonst Crash.
Nen tolles Buch, und du kannst es auch noch online lesen oder als Nachschlagewerk verwenden: http://openbook.galileocomputing.de/visual_csharp/
Moin, ich habe gute Erfahrungen mit der Split methode gemacht. Sie ist eine eindfache Möglichkeit einen String zu teilen. Die Einzelnen Zahlen würde ich jedoch nicht durch ein " " (Leerzeichen) trennen, sondern z.B. durch ein ";", da dies eine definiertes Zeichen darstellt. Der Vorteil ist, dass du die Daten wie gewünscht gleich in einem Array hast und weiterverarbeiten kannst. In die Textdatei schreibst du die Daten dann ebenfalls mit dem definierten Steuerzeichen z.B. ";" so kannst du die Daten auch mit der gleichen Methode einlesen. Wenn du die Daten nur zur Anzeige bringen willst, brauchst du die String Werte auch nicht in eine Zahl wandeln, da das Array ziemlich groß wird und die Einlesegeschwindigkeit doch recht hoch ist. Ich würde die Werte erst bei bedarf in eine Zahl wandeln.
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.