Datum:
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:
int main(void) { init_uart(); unsigned char Line[40]; unsigned char zwischen; unsigned int erg; while(1) { uart_puts("AT Z"); _delay_ms(50); uart_puts("AT SP0"); _delay_ms(50); uart_puts("01 05"); _delay_ms(50); uart_gets( Line, sizeof( Line ) / sizeof( Line[0] ) ); zwischen=Line[0]; uart_puts(Line); if ((zwischen=='F')||(zwischen=='f') ) { uart_puts("Jaaaa"); } else { uart_puts("hmmm"); } erg= ascii2int(zwischen); if(erg==15) { uart_puts("juhuuuu"); } else { uart_puts("hmmmmmmmmm8"); } _delay_ms(2000); } } /* #################################ascii 2 int###################################*/ unsigned int ascii2int (unsigned char ascii) { unsigned int dez; switch (ascii) { case 'A': dez=10; break; case 'B': dez=11; break; case 'C': dez=12; break; case 'D': dez=13; break; case 'E': dez=14; break; case 'F': dez=15; break; } return dez; } |
Ihr werdet euch jetzt wahrscheinlich krumm lachen weil es so einfach ist, aber ich weiß echt nicht weiter. mfg ulmi
Datum:
Schreibe mal ein
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?
Datum:
Der Compiler sollte dir außerdem eine Warnung geben, dass dez bei der Funktion ascii2int nicht initialisiert ist: Falls ascii kein Zeichen aus ABCDEF ist, welchen Wert gibt die Funktion zurück?
Datum:
if( ascii>='0' && ascii<='9' ) { dec = ascii - '0'; } else if( ascii>='A' && ascii<='F' ) { dec = ascii - 'A' + 10; } else if( ascii>='a' && ascii<='f' ) { dec = ascii - 'a' +10; } else { dec = ERROR; } |
oder
dec = ERROR; dec = (ascii>='0' && ascii<='9') ? (ascii - '0' ) : dec; dec = (ascii>='A' && ascii<='F') ? (ascii - 'A' + 10) : dec; 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:
dec = (ascii>='0' && ascii<='9') ? (ascii - '0' ) : ERROR; 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 ;)