conflicting types brauche bitte dringend hilfe

OP #2672422
Lesenswert?

Hallöchen,

mein Ziel ist es mit einem Atmega8 einen Hex Wert (also zum bsp 4F) über 
den UART zu empfangen. Mit diesem Wert soll dann weitergearbeitet 
werden.

Mein Problem ist nun, dass bei der Übertragung von F ja der Ascii Wert 
übertragen wird (also 70). Jetzt hab ich mir überlegt, den Wert einfach 
umzuwandeln und mir die korrekte Zahl auszurechnen.

Leider gibt es bei dem Unterprogrammaufruf ein Problem.
Ich bekomme immer "conflicting types for 'ascii2int'".
Was habe ich falsch gemacht? Oder gibt es eine andere einfachere Lösung 
für mein Vorhaben?

Hier mein Code:
1
int main(void)
2
{
3
  
4
  init_uart();
5
  unsigned char Line[40];      
6
  unsigned char zwischen;
7
  unsigned int erg;
8
  
9
 
10
    while(1)
11
    {
12
      
13
    uart_puts("AT Z");
14
     _delay_ms(50);
15
     uart_puts("AT SP0");
16
     _delay_ms(50);
17
     uart_puts("01 05");
18
     _delay_ms(50);
19
     
20
     uart_gets( Line, sizeof( Line ) / sizeof( Line[0] ) );
21
   
22
     zwischen=Line[0];
23
     uart_puts(Line);
24
     
25
  if ((zwischen=='F')||(zwischen=='f') )
26
  {    
27
     uart_puts("Jaaaa");
28
  }
29
  else
30
  {
31
    uart_puts("hmmm");
32
  }
33
  
34
  erg= ascii2int(zwischen);
35
         
36
     
37
  if(erg==15)
38
  {
39
    uart_puts("juhuuuu"); 
40
  }
41
  
42
  else
43
  {
44
    uart_puts("hmmmmmmmmm8");
45
  }
46
     
47
    
48
    _delay_ms(2000); 
49
    }
50
}
51

52

53
/* #################################ascii 2 int###################################*/
54

55

56
unsigned int ascii2int (unsigned char ascii)
57
{
58
  unsigned int dez;
59
  
60
  
61
  switch (ascii)
62
  {
63
    
64
    case 'A':
65
      dez=10;
66
      break;
67
    case 'B':
68
      dez=11;
69
      break;
70
    case 'C':
71
      dez=12;
72
      break;
73
    case 'D':
74
      dez=13;
75
      break;
76
    case 'E':
77
      dez=14;
78
      break;
79
    case 'F':
80
      dez=15;
81
      break;
82
  }
83

84
  return dez;
85
}


Ihr werdet euch jetzt wahrscheinlich krumm lachen weil es so einfach 
ist, aber ich weiß echt nicht weiter.

mfg ulmi
Gast #2672425
Lesenswert?

Schreibe mal ein
1
unsigned int ascii2int (unsigned char ascii);

vor main(). An der Stelle kennt der Compiler nämlich die Funktion noch 
nicht und nimmt per default an, daß sie int als Parameter- und 
Rückgabetyp hat.
Übrigens: Warum benutzt du unsigned char statt char für Text?
#2672500
Lesenswert?

1
if( ascii>='0' && ascii<='9' )
2
{
3
    dec = ascii - '0';
4
}
5
else if( ascii>='A' && ascii<='F' )
6
{
7
    dec = ascii - 'A' + 10;
8
}
9
else if( ascii>='a' && ascii<='f' )
10
{
11
    dec = ascii - 'a' +10;
12
}
13
else
14
{
15
    dec = ERROR;
16
}

oder
1
dec = ERROR;
2
dec = (ascii>='0' && ascii<='9') ? (ascii - '0'     ) : dec;
3
dec = (ascii>='A' && ascii<='F') ? (ascii - 'A' + 10) : dec;
4
dec = (ascii>='a' && ascii<='a') ? (ascii - 'a' + 10) : dec;

error wäre dann ein define, z.B. 0xFF

wenn du keine kleinen Buchstaben akzeptieren willst dann reicht 
natürlich auch:
1
dec = (ascii>='0' && ascii<='9') ? (ascii - '0'     ) : ERROR;
2
dec = (ascii>='A' && ascii<='F') ? (ascii - 'A' + 10) : dec ;

wenn du dann noch die richtige Zahl haben willst bei "4F" musst du die 4 
natürlich noch mit 16 multiplizieren und dann zum F addieren. (oder 4x 
links  schieben) Bei mehr als 2 Ziffern macht sich natürlich ne schleife 
gut. ( while( return != ERROR ) ... )

EDIT: ich weiß übrigens das die Klammern in dem ?-Operator unnötig sind, 
die dienen nur der Übersichtlichkeit ;)

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