Forum: Mikrocontroller und Digitale Elektronik Software um Daten von µC über RS232 aufzeichnen


von Tobias X. (tobiasblome)


Lesenswert?

Hallo,
ich lese 3-4 Analogwerte ein und möchte diese in Echtzeit auf dem PC in 
einem Diagramm sehen. Gibt es da eine Software für, die den Comport 
"ausliest" und wenn ja wie?
Wie muss der µC senden?

Toll wäre wenn ich die Variablen A-D senden könnte:

A:24,21
B:151,26
C:45,23
D:0,25
A:24,25
B:
C:
D:

und so weiter...

Tobias

von Alex B. (Firma: Ucore Fotografie www.ucore.de) (alex22) Benutzerseite


Lesenswert?

Die "Echtzeit" wird dabei immer "unechter" je feiner du die Auflösung 
für deine Werte machst. Da die serielle Schnittstelle nur bis max. 250 
kbit/s schafft. Deine Auswertung der Messwerte (dieses A:24,21) etc. 
würde ich durch den PC durchführen lassen, denn der ist vermutlich um 
einiges schneller damit fertig als wenn der µc es macht. Du bräuchtest 
dann auf dem µc in einer Endlosschleife immer nur nacheinander Analog1 
bestimmen, per RS232 senden, Analog2 bestimmen, senden, etc. und dann am 
PC mit einer Software in grafische(?) Daten umwandelt.
Ansonsten, ein Programm, dass den Com-Port permanent überwacht ist z.B. 
Hyper-Terminal

Schöne Grüße,
Alex

Edit: Mir ist da gerade noch was eingefallen: Unter der Annahme das du 
10Bit A/D Wandler benutzt, würde ich dann für jeden Port (A,B,C,D) je 
2Byte (=16Bit) senden, wobei die "freien" 6 Bit zur Identifikation des 
nun gesendeten Ports verwendet werden können.
Die maximale Wiederholrate wäre denn demnach 5208 Hz je Port.

von Andi (Gast)


Lesenswert?

Schick die Werte als ASCII Code per RS232. Hyper-Terminal kann die dann 
auffangen und ind Textdatei speichern. Ab besten trenne die einzelne 
Kanäle mit einem TAB-Zeichen (bei printf-Befehl wäre das "\t") Ganze 
Messung schließe mit RET-Zeichen ("\r"). Dann hättest du in der 
Text-Datei die Kanäle schön in Spalten und die Messungen in Reihen 
angeordnet.
Öffne danach Textdatei, kopiere die Daten und füge in eine Exel Tabelle
Wegen TABs werden die Daten in einzelnen Zellen  gespeichert:
A        B        C       D...
24,21   151,26    45,23   0,25
24,62   152,21...

Mit dieser Datentabelle kannst du nun im Exel grafisches Diagramm 
erstellen und die Daten graphisch betrachten und abspeichern.

Beispiel ind C für String Vorbereitung:
char text[30]; //Array für Stringaufnahme
sprintf(text,"%i\t%i\t\%i\t\%i\r", a, b, c, d);//Daten in einen String 
mit "TABs" und "RET" umwandeln
printUart(text);//Ausgabe des Strings über RS232(Funktion selbst 
geschrieben)

von Tobias X. (tobiasblome)


Lesenswert?

@ Alex:

Also mit "Echtzeit" habe ich etwas übertrieben. Wenn das Diagramm auf 
dem PC eine Sekunde verzögert angezeigt wird, wäre das auch nicht sooo 
schlimm.

 @ Andi:

Tolle Idee mit dem Tab. Aber was ist denn das RET-Zeichen und wofür ist 
das gut? Ist das vielleicht ein allgemeines Zeichen für ENDE oder so?

Also ich wollte auf jeden Fall im ASCII Code per RS232 senden. Wenn ich 
das mit dem Hyper-Terminal aufzeichne, kann ich das aber nicht sofort in 
Excel ansehen sondern erst, wenn die Messung zu ende ist...
Und wie gesagt unbedingt als Kurvendiagramm, mit nur kurzen 
Verzögerungen.

von Stefan K. (_sk_)


Lesenswert?

Vielleicht kannst Du ja Deine Ausgabe an Logview anpassen (ist 
"Donationware"):

http://www.logview.info

Viele Grüße, Stefan

von Tobias X. (tobiasblome)


Lesenswert?

;-)

ja die Software ist nicht übel, müsste man nur herausbekommen wie man 
die ansteuern muss...

Aber nochmal zu den TAB´s: Der Befehl geht leider unter Basic nicht und 
ich konnte auch nichts in der Hilfe finden.

Also bisher habe ich immer so gesendet:
"Test1" als Text und H ist die Variable

Print "Test1" ; H

Tobias

von Stefan K. (_sk_)


Lesenswert?

Da musst Du keine Geheimnisse rausbekommen, das ist dokumentiert unter:

Geräteliste -> Testformate -> Testformat Lader
                           -> Testformat Datenlogger

und das sieht auf einem mc sehr einfach zu implementieren aus.

Wenn die Baudrate unpassend ist:
ich verwende dann gern einen USB->RS232 Wandler, mit dem kann man der 
PC-Applikation eine Baudrate vortäuschen, während die "echte" Baudrate 
zum mc eine ganz andere ist (wer will heute schon noch mit 9600Baud 
arbeiten?).

Gruß, Stefan

von Severino R. (severino)


Lesenswert?

@Tobias

TAB ist kein Befehl, sondern ein ASCII-Steuerzeichen.

Du kannst es in Basic normalerweise mit CHR$(9) senden, also:
PRINT "Test1"+CHR$(9)+"Wert"
fügt zwischen "Test1" und "Wert" einen Tabulator ein.

Mit RET ist weiter oben Return gemeint, ASCII 13, also in Basic 
CHR$(13).
Eigentlich heisst es korrekt CR. Oft ist anschliessend auch noch ein LF 
(Line Feed; Zeilenschaltung) erforderlich, das ist ASCII 10.

Severino

von Tobias X. (tobiasblome)


Lesenswert?

super!
mit dem TAB werde ich gleich mal ausprobieren


@Stefan

fasse mal zusammen:

-  Daten kommen im Sekundentakt
-  10V = 10000 im Datenformat
-  Erweiterungen sind ungenutzt: einfach 000 dezimal senden

soweit ganz einfach...aber

wofür steht:

oben: 1-2-3-4-4-4
und: 1234567890 123456789

Die Buchstaben darunter ersetze ich durch meine Werte/Variablen
und zum Schluss: <cr><lf>

???
Tobias
???



         1         2         3         4      4   4
12345678901234567890123456789012345678901234567   8
k;tttttt;UUUUU;IIIII;CCCCCC;PPPPPP;TTTTT;y;zzz<cr><lf>
(48 Byte)

k   Kanalnummer
tttttt  Zeit in Sekunden (neuer Datensatz beginnt bei 0)
UUUUU  Spannung in mV
IIIII  Strom in mA
CCCCCC  Ladung in mAh
PPPPPP digitaler Zähler
TTTTT  Temperatur in 0.1°C Schritten
y   Status dezimal (0 = laden, 1 = entladen, 2 = Pause,
                            9 = keine Aktion)
zzz   Erweiterungen (im Moment einfach 000 dezimal)



von Tobias X. (tobiasblome)


Lesenswert?

Also ich habe nun ein kleines testprogramm geschrieben
welches jede sekunde die Spannung um 1 hochzählt.

Aber leider funktiniert das nicht:
im Hyper-Terminal sieht das schon ganz gut aus aber LogView sagt nix...

Also gesendet wird:

'senden ;kanal ;     Zeit     ;  Spannung   ;
Print   ; K ; ";" ; Tttttt ; ";" ; Uuuuu ; ";"


   Strom     ;  Kapazität;   Zähler  ; ;      Temp.    ;Status
; Iiiii ; ";" Cccccc ; ";" ; Pppppp ; ";" ; Ttttt ; ";" ; Y ; ";" ;


;Erweiterung
Zzz;       '< Cr >< Lf>

und das kommt auf dem Comport an:
1;0;0;0;0;0;0;9;0
1;1;2;0;0;3;0;0;0
1;2;4;0;0;6;0;0;0
1;3;6;0;0;9;0;0;0


1.Stelle Kanal 1: bleibt
2.Stelle Sekunden werden hochgezählt
3.Stelle Spannung immer +2
6.Stelle Drehzahl immer +3
8.Stelle Status bei Start auf 9, danach immer auf 0


nur weiß ich nicht was ich mit < Cr >< Lf>  machen soll, naja und die 
zahlen darüber?:
        1         2         3         4      4   4
12345678901234567890123456789012345678901234567   8
k;tttttt;UUUUU;IIIII;CCCCCC;PPPPPP;TTTTT;y;zzz<cr><lf>


1;0;0;0;0;0;0;9;0
1;1;2;0;0;3;0;0;0
1;2;4;0;0;6;0;0;0
1;3;6;0;0;9;0;0;0

von Stefan K. (_sk_)


Lesenswert?

>nur weiß ich nicht was ich mit < Cr >< Lf>  machen soll, naja und die
>zahlen darüber?:
>        1         2         3         4      4   4
>12345678901234567890123456789012345678901234567   8
>k;tttttt;UUUUU;IIIII;CCCCCC;PPPPPP;TTTTT;y;zzz<cr><lf>

Die Zahlen in den oberen beiden Reihen musst Du natürlich NICHT senden - 
die zeigen Dir nur die Ziffernstellen an (damit Du es beim Abzählen 
leichter hast):
obere Reihe sind die Zehnerstellen,
untere Reihe die Einsterstellen.

<CR><LF> bedeutet "Carriage Return", "Line Feed" und entspricht den 
Zahlen 13 und 10 (dezimal) bzw. 0D-hex und 0A-hex.
Siehe dazu auch:
http://de.wikipedia.org/wiki/Zeilenvorschub

Dein Problem ist wahrscheinlich, dass Deine Zahlen nicht die Stellenzahl 
haben, die das Format verlangt, sende mal statt

1;0;0;0;0;0;0;9;0
1;1;2;0;0;3;0;0;0
1;2;4;0;0;6;0;0;0
1;3;6;0;0;9;0;0;0

1;000000;00000;00000;000000;000000;00000;9;000
1;000001;00002;00000;000000;000003;00000;0;000
1;000002;00004;00000;000000;000006;00000;0;000
1;000003;00006;00000;000000;000009;00000;0;000

Jede Zeile muss dabei mit CR und LF abgeschlossen werden, siehe oben.

Wie Du das Deinem Basic beibringst, weiss ich nicht. Zum Testen kannst 
Du ggf. einfach mal diese Strings an Logview senden.

Gruß, Stefan

von (Gast)


Lesenswert?

Sehr komfortabel ist Multimes. Deine 4 Daten kannst du in Multimes 4 auf 
jeweils eigenen Kanälen mitloggen. Du mußt die Ziffern dabei in Asci 
senden, das Datenformat ( Zeichenlänge , Trennzeichen usw. und alle 
Schnittstellenparameter sind frei kofigurierbar. Ich benutze es ständig 
in Verbindung mit uC. Display, Tabellen und Grafikdarstellung - wie du 
willst.
Es muß aber eine Datensatz sein, also

wertA Trennzeichen wertB trennzeichen wertC trennzeichen WertD 
datenabschlußzeichen

Es stellt sich allerdings tatsächlich die Frage was du unter Echtzeit 
verstehst, ich glaube ich hab bisher so 3 Daten/sek geschafft, 
limitierend war das aber meine Messroutine, nicht das Programm.

von Tobias X. (tobiasblome)


Lesenswert?

@Stefan

 <CR><LF> bedeutet "Carriage Return", "Line Feed" und entspricht den
Zahlen 13 und 10 (dezimal) bzw. 0D-hex und 0A-hex.

ach so.

Weiss jemand wie ich Hex Zeichen in Basic sendet?
Habe das so versucht:

Print "1;000013;08239;05010;000017;000252;00000;0;000" ;Hex(0a);Hex(0d)

Aber da kommt immer eine Fehlermeldung vonwegen

"Numeric parameter expected [0A]"

von Tobias X. (tobiasblome)


Lesenswert?

so nun hab´ ich´s gefunden....

Das muss ich gar nicht senden, weil das der µC von selber sendet! ;-)

Also ist der Fehler gefunden:

es sind die fehlenden NULLEN!

so funktioniert es :-)

Print "1;000001;08239;05010;000017;000252;00000;0;000"

nur wie bekomme ich die Nullen in die Zahlen? Ich möchte ja eigendlich 
einen Analogport auslesen und das Ergebniss mit Nullen auffüllen.

von Stefan K. (_sk_)


Lesenswert?

Wie gesagt, ich programmiere nicht mit Basic. Probier doch mal, jede 
einzelne Deiner Zahlen mit

STR$ (Zahl)

in einen String umzuwandeln. Mit

LEN (String)

bekommst Du dann die Länge raus, und damit kannst Du dann ausrechnen, 
wieviel Nullen Du vorne noch anhängen musst.

Zum Schluss setzt Du den String zusammen - alle Zahlen-Strings plus die 
Semicolons dazwischen. Das Ergebnis schickst Du dann an den PC.

Bei basic-spezifischen Sachen musst Du mal andere hier fragen, ode Du 
liest Dir diese Seite durch:

http://www.qbasic.de/

Dann auf

Textverarbeitung - Manipulation von Zeichenketten (Strings)

gehen.


Gruß, Stefan

von TobiasBlome (Gast)


Lesenswert?

Ja super,

String*6 ist das eine um max 6 Zeichen zu benutzen
und dann:

Test_in2 = Str(Test_in1)
Tttttt = Format(Test_in2 , "000000")
Print Test

Danke ;-)

kann geschlossen werden

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.