www.mikrocontroller.net

Forum: PC-Programmierung SerialPort Variablen C#


Autor: Wolf100 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Frederik Krämer (n0ll4k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Christopher Schenk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Diese werte kannst du mit Convert.ToDouble(wert); konvertieren.

ich hoffe hab dir geholfen wenn nicht beschreibe dein Problem genauer

MFG

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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....

Viel Spaß, Tom.

Autor: Wolf100 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Wolf100 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das geht ja schnell hier, :-)

und wie trenne ich die Werte?

Gruß Wolf100

Autor: Christopher Schenk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
            string fromController = "231 6.05 11.00 3045";
            var splitStrings = fromController.Split(new Char[] { ' ' }, StringSplitOptions.None);
            var results = new double[4];
            for (int i = 0; i < splitStrings.Length; i++) {
                results[i] = Convert.ToDouble(splitStrings[i]);
            }

Autor: Christopher Schenk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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]);

            }

Autor: Frederik Krämer (n0ll4k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Christopher Schenk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
zu langsam;)

Autor: Wolf100 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke an alle,

werde mich mit Euren Tipps auseinandersetzten. Wenn ich noch Fragen habe 
würde ich mich noch mal melden.


Gruß Wolf100

Autor: Wolf100 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Sven H. (dsb_sven)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Sven H. (dsb_sven)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ;-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Wolf100 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: tuppes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Sven H. (dsb_sven)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nen tolles Buch, und du kannst es auch noch online lesen oder als 
Nachschlagewerk verwenden:

http://openbook.galileocomputing.de/visual_csharp/

Autor: Wolfgang W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.