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