mikrocontroller.net

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


Autor: GoZu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: GoZu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: 1.8T-Passat (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kernighan Ritchie (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
google: variable Argumentenliste

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leutz,

zum zerreissen, als Beispiel, wie auch immer :-)

VG,
/th.


#ifndef __THPRINTF_H__
#define __THPRINTF_H__


#define MAX_NUM_LEN      6      ///<  max. chars for a number
#define MAX_NUM_DEC      10E06    ///< Put the same Number here as in MAX_NUM_LEN

int thprintf(char *string, ...);



#endif

/******************************************
 ***
 ***      Th-Shell
 ***  Command-Shell for Microcontrollers
 *** ------------------------------------
 ***
 *** Author: Thorsten de Buhr
 *** eMail:  thorsten@lasertechnix.de
 *** Date started: 20.08.2006
 *** last Modified: 09.11.2006
 ***
 *** Modules:
 *** --------
 ***
 *** thprintf.c, thprintf.h
 ***
 ***
 *** Description:
 *** -------------
 ***
 *** Tiny printf-function, which provides most-used opts of printf.
 *** Usage is the same as printf
 *** 
 *** 
 *** 
 *** 
 *** Use is free, could run or not ;-)
 *** 
 *** U may change every printf in cour code to thprintf, the rest is the same.
 ***
 *** U may use:
 *** %i, %s, %c
 *** \n, \t, \r
 *** 
 *** More is not implemented now.
 *** 
 *** Have fun with this very small print-function, it uses ~300 bytes of code 
 *** 
 ******************************************/


/** 
* @file   thprintf.c
* @brief   very small printf-func
* @author   Th. de Buhr (thorsten@lasertechnix.de)
* @date   09.11.2006
*/

#include <stdio.h>
#include <stdarg.h>
#include "main.h"
#include "thprintf.h"




/**
* \author Th. de Buhr (thorsten@lasertechnix.de)
* \param (char) *string, ... (vargs)
* \return (int) 0 (now, perhaps something different later ?
* \brief very small printf-function, which provides the most-used funcs of printf (see above)
*/
int thprintf(char *string, ...)
{
  va_list tag;
  int i=0;
  char *pointer=0;
  signed int int_tmp=0;
  
  va_start(tag, string);
    
  do
  {  
    if(*string == '%') 
    {
      switch(*(++string))
      {
        case 'i':
        {
          int_tmp = va_arg(tag, int);
        
          if(int_tmp <0)
          {
            fputc('-', 0);
            int_tmp=-int_tmp;
          }
          
          
          pointer = (char*)int_tmp;
          for(i=MAX_NUM_DEC; i; i/=10)
          {                      
            if((int)pointer/i)
            {             
              fputc((int_tmp/i)+48, 0);
              int_tmp%=i;
            }
            else if(i<10) fputc(0+48, 0);
          }        
        } break;
        
        case 'c':
        {        
          fputc((char)va_arg(tag, int), 0);        
        } break;
      
        case 's':
        {
          pointer = va_arg(tag, char*);
          
          do
          {
            fputc(*pointer, 0);          
          } while(*pointer++);                  
        } break;
      }
    } // end if '%'
    
    else if(*string == '\\') 
    {          
      switch(*(++string))
      {
        case 'n': fputc('\n', 0);
          break;
          
        case 't': fputc('\t', 0);
          break;
          
        case 'r': fputc('\r', 0);
          break;
      }  
    } // end if '\'      
    
    else fputc(*string, 0);
  
  } while(*(++string));
    
  va_end(tag);

  return(0);
}


Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.