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