Forum: Mikrocontroller und Digitale Elektronik Unbekannte Anzahl an Paramter übergeben


von GoZu (Gast)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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.

von GoZu (Gast)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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.

von 1.8T-Passat (Gast)


Lesenswert?

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.

von Kernighan Ritchie (Gast)


Lesenswert?

google: variable Argumentenliste

von Random .. (thorstendb) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.