struct mit Funktionspointer; Funktionsaufruf macht Ärger

#2994768
Lesenswert?

Servus,

ich komme direkt zur Sache. Ich habe das Gefühl ich mache beim Aufruf 
meiner Funktionen einen Fehler, denn irgendwie scheint es als würde 
keine der Funktionen aufgerufen. Geht um eine ganz einfach 
UART-Befehls-Ausführung (welche noch größer wachsen soll):
1
#include <stdint.h>
2
#include <avr/io.h>
3
#define BAUD 9600
4
#include <util/setbaud.h>
5

6
uint8_t foo1( uint8_t *d )
7
{
8
  UDR0 = *d;
9
  return *d;
10
}
11
uint8_t foo2( uint8_t *d )
12
{
13
  UDR0 = d[0] + d[1];
14
  return d[0] + d[1];
15
}
16
uint8_t foo3( uint8_t *d )
17
{
18
  UDR0 = d[1];
19
  return d[1];
20
}
21

22
typedef struct {
23
  uint8_t length;          // anzahl der Parameter
24
  uint8_t  (*f)(uint8_t *data);  // Funktionspointer mit pointer auf Parameter
25
} command_t;
26

27
uint8_t buf[3];
28
const command_t commands[3] =  // fixe liste, da wird sich nie was ändern, daher const
29
  {
30
    { 1, foo1 },
31
    { 2, foo2 },
32
    { 2, foo3 }
33
  };
34

35

36
int main(void)
37
{
38
  
39
  //init
40
  DDRD = (1<<1);
41
  UBRR0  = UBRR_VALUE;
42
  UCSR0C  = (1<<UCSZ00) | (1<<UCSZ01);  // asynchronous 8n1 Mode
43
  UCSR0B  = (1<<RXEN0) | (1<<TXEN0);    // Enable Receiver and Transmitter
44

45
  
46
  uint8_t i = 0;
47
  while(1)
48
  {
49
    if( UCSR0A & (1<<RXC0) )
50
    {
51
      buf[i] = UDR0;
52
      i++;
53
      if( i>0 && i == commands[ buf[0] ].length )
54
      {
55
        i=0;
56
        (*commands[ buf[0] ].f)( &buf[1] );
57
      }
58
    }
59
  }
60
}

Ich wollte euch als kurz fragen ob denn der Funktionsaufruf
1
 (*commands[ buf[0] ].f)( &buf[1] );
 so überhaupt richtig ist oder ob ich da gravierend was falsch mache, 
und wenn ja was.

Vielen Dank schonmal
Gruß
Tobias
Gast #2994816
Lesenswert?

Es spielt keine Rolle. Bei Funktionszeigern ist das äquivalent. Du 
kannst also vor den Funktionsnamen soviele '*' oder auch '&' machen, wie 
du willst. Die meisten machen deshalb gar nichts davor.
#2995620
Lesenswert?

Klaus schrieb:
> Einen Breakpoint auf die Funktion setzen und schauen ob er kommt?

Dafür war das Senden per UART gedacht. UDR0 = ...
Der Fehler war jetzt dann doch Blöder als Trivial. Beim Löten muss sich 
das Pad eines Schutzwiderstandes in der TX-Leitung des µC von der 
Leiterbahn getrennt haben. Am Port-Pin lag das Signal noch an, am 
Widerstand nimmer. Leiterbahn aufkratzen und Brücke setzten hat 
geholfen. So nen Mist.

Trotz alle dem, hab ich wieder was gelernt, Danke.

Gruß Tobi

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren