Forum: PC-Programmierung SerialPort Variablen C#


von Wolf100 (Gast)


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

von Frederik K. (n0ll4k)


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.

von Christopher Schenk (Gast)


Lesenswert?

Diese werte kannst du mit Convert.ToDouble(wert); konvertieren.

ich hoffe hab dir geholfen wenn nicht beschreibe dein Problem genauer

MFG

von Tom (Gast)


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.ports.serialport%28VS.80%29.aspx

Viel Spaß, Tom.

von Wolf100 (Gast)


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

von Wolf100 (Gast)


Lesenswert?

das geht ja schnell hier, :-)

und wie trenne ich die Werte?

Gruß Wolf100

von Christopher Schenk (Gast)


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

von Arc N. (arc)


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.
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
            }

von Christopher Schenk (Gast)


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]);

            }

von Frederik K. (n0ll4k)


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.

von Christopher Schenk (Gast)


Lesenswert?

zu langsam;)

von Wolf100 (Gast)


Lesenswert?

Danke an alle,

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


Gruß Wolf100

von Wolf100 (Gast)


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

von Sven H. (dsb_sven)


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

von Karl H. (kbuchegg)


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

von Sven H. (dsb_sven)


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 ;-)

von Karl H. (kbuchegg)


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.

von Wolf100 (Gast)


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

von Karl H. (kbuchegg)


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.

von tuppes (Gast)


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.

von Sven H. (dsb_sven)


Lesenswert?

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

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

von Wolfgang W. (Gast)


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.

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.