Hi, ich muss eine Funktion schreiben, bei der eine variable anzahl an paramtern übergeben werden. Also der Benutzer kann zuerst Auswählen, ob jetzt z.b. Spannung, Strom, Leistung,... gemessen werden soll und dann sollen nur genau diese Werte übergeben werden! Ich habs früher einmal schon gesehen, dass so etwas möglich ist, allerdings habe cih keine Ahnung mehr, wo ich das suchen sollte.... Hatte wenn mich nicht alles täuscht etwas mit Arrays zu tun.... Wäre wirklich sehr dankbar, wenn mir jemand helfen könnte.
in welcher Programmiersprache denn? und woher soll die funktion denn wissen wenn nur ein wert übergeben ist ob es nun der Strom oder die Spannung ist? Bitte ein etwas genauere beschreibung.
Ok ich beschreibs mal kurz: Über einen PC stellt man über USB (über USART) beim µC ein, welche Werte gemessen werden. (das ganze geht über eine Bitmaske) Dann misst der µC über einen Messchip die Werte (Spitzenspannung,Effektivwerte, Oberwellen, Temperatur,... ) Sind ungefähr 30 Werte, die gemessen werden können. Danach werden sämtliche Werte auf einer SD-Karte gespeichert und bei Anfrage vom PC wieder über USART übertragen. Und ich bin gerade beim programmieren von dieser Übertragungsfunktion. D.h. über die Bitmaske weiß ich, dass jetzt z.b. der erste Wert der Strom ist und der 5te z.b. die Wirkleistung. Allerdings wie übergebe ich diese Werte dieser Funktion? void USART_neue_zeile( /* Paramter */ ) { uint8_t laenge; // Sende FF (Start) USART_send(0xFF); // Sende Seq Nr. USART_send_seq_nr(); // Berechne die variable Länge // Sende die Länge // Sende Befehlscode 0x11 USART_send(0x11); //Sende Daten //Berechne Pruefsumme pruefsumme = 0x11; // + Paramter //Sende Pruefsumme USART_send(pruefsumme); } Programmiersprache ist übrigens C (sollte sowieso ersichtlich sein :> ) Ein packet schaut immer aus 0xFF danach die Sequenz Nummer, dann die Länge, danach der Befehlscode (was ist das für ein packet?) und anschießend die Daten mit der Pruefsumme.
die Frage ist wie wird die Funktion aufgerufen, dort ist ja dann das gleiche Problem. Ich würde der funktion ein zeiger auf ein array übergeben und die anzahl der elemente: funktion( int* daten, int count ); wenn du es wirklich mit variabler liste machen willst dann schau dir mal die macros "va_arg, va_end, va_start" an.
Warum fragst Du nicht in Deiner Funktion die Bitmaske auf gesetzte Bits ab, und leitest dann bei jedem gesetzten Bit die entsprechende Messung ein? Als Beispiel: Es wird die Bitfolge 00000101 übergeben: if (Bitfolge & 1) ......Messung 1 ausführen (Z.B. Spannung) if (Bitfolge & 1<<1) ......Messung 2 ausführen (Z.B. Strom) if (Bitfolge & 1<<2) ......Messung 3 ausführen (Z.B. Temperatur) ... Es würden also nur die Messung von Bit0 und Bit2 ausgeführt.
Hi Leutz, zum zerreissen, als Beispiel, wie auch immer :-) VG, /th.
1 | #ifndef __THPRINTF_H__
|
2 | #define __THPRINTF_H__
|
3 | |
4 | |
5 | #define MAX_NUM_LEN 6 ///< max. chars for a number
|
6 | #define MAX_NUM_DEC 10E06 ///< Put the same Number here as in MAX_NUM_LEN
|
7 | |
8 | int thprintf(char *string, ...); |
9 | |
10 | |
11 | |
12 | #endif
|
1 | /******************************************
|
2 | ***
|
3 | *** Th-Shell
|
4 | *** Command-Shell for Microcontrollers
|
5 | *** ------------------------------------
|
6 | ***
|
7 | *** Author: Thorsten de Buhr
|
8 | *** eMail: thorsten@lasertechnix.de
|
9 | *** Date started: 20.08.2006
|
10 | *** last Modified: 09.11.2006
|
11 | ***
|
12 | *** Modules:
|
13 | *** --------
|
14 | ***
|
15 | *** thprintf.c, thprintf.h
|
16 | ***
|
17 | ***
|
18 | *** Description:
|
19 | *** -------------
|
20 | ***
|
21 | *** Tiny printf-function, which provides most-used opts of printf.
|
22 | *** Usage is the same as printf
|
23 | ***
|
24 | ***
|
25 | ***
|
26 | ***
|
27 | *** Use is free, could run or not ;-)
|
28 | ***
|
29 | *** U may change every printf in cour code to thprintf, the rest is the same.
|
30 | ***
|
31 | *** U may use:
|
32 | *** %i, %s, %c
|
33 | *** \n, \t, \r
|
34 | ***
|
35 | *** More is not implemented now.
|
36 | ***
|
37 | *** Have fun with this very small print-function, it uses ~300 bytes of code
|
38 | ***
|
39 | ******************************************/
|
40 | |
41 | |
42 | /**
|
43 | * @file thprintf.c
|
44 | * @brief very small printf-func
|
45 | * @author Th. de Buhr (thorsten@lasertechnix.de)
|
46 | * @date 09.11.2006
|
47 | */
|
48 | |
49 | #include <stdio.h> |
50 | #include <stdarg.h> |
51 | #include "main.h" |
52 | #include "thprintf.h" |
53 | |
54 | |
55 | |
56 | |
57 | /**
|
58 | * \author Th. de Buhr (thorsten@lasertechnix.de)
|
59 | * \param (char) *string, ... (vargs)
|
60 | * \return (int) 0 (now, perhaps something different later ?
|
61 | * \brief very small printf-function, which provides the most-used funcs of printf (see above)
|
62 | */
|
63 | int thprintf(char *string, ...) |
64 | {
|
65 | va_list tag; |
66 | int i=0; |
67 | char *pointer=0; |
68 | signed int int_tmp=0; |
69 | |
70 | va_start(tag, string); |
71 | |
72 | do
|
73 | {
|
74 | if(*string == '%') |
75 | {
|
76 | switch(*(++string)) |
77 | {
|
78 | case 'i': |
79 | {
|
80 | int_tmp = va_arg(tag, int); |
81 | |
82 | if(int_tmp <0) |
83 | {
|
84 | fputc('-', 0); |
85 | int_tmp=-int_tmp; |
86 | }
|
87 | |
88 | |
89 | pointer = (char*)int_tmp; |
90 | for(i=MAX_NUM_DEC; i; i/=10) |
91 | {
|
92 | if((int)pointer/i) |
93 | {
|
94 | fputc((int_tmp/i)+48, 0); |
95 | int_tmp%=i; |
96 | }
|
97 | else if(i<10) fputc(0+48, 0); |
98 | }
|
99 | } break; |
100 | |
101 | case 'c': |
102 | {
|
103 | fputc((char)va_arg(tag, int), 0); |
104 | } break; |
105 | |
106 | case 's': |
107 | {
|
108 | pointer = va_arg(tag, char*); |
109 | |
110 | do
|
111 | {
|
112 | fputc(*pointer, 0); |
113 | } while(*pointer++); |
114 | } break; |
115 | }
|
116 | } // end if '%' |
117 | |
118 | else if(*string == '\\') |
119 | {
|
120 | switch(*(++string)) |
121 | {
|
122 | case 'n': fputc('\n', 0); |
123 | break; |
124 | |
125 | case 't': fputc('\t', 0); |
126 | break; |
127 | |
128 | case 'r': fputc('\r', 0); |
129 | break; |
130 | }
|
131 | } // end if '\' |
132 | |
133 | else fputc(*string, 0); |
134 | |
135 | } while(*(++string)); |
136 | |
137 | va_end(tag); |
138 | |
139 | return(0); |
140 | }
|
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.