Hallo,
ich möchte eine Zeichenkette die in dem Char Array "pc_data" enthalten ist in eine Integer Zahl umwandeln, die ich beispielweise einem Register (in diesem Fall PortB=i_value) zuweisen möchte. Ich sende vom Pc aus einen String, der Zahlen von 0-255 enhält: z.B. "7" oder "132".
Für Zahlen von 0-9 funktioniert das auch ganz gut. Die Zahlen werden mit atoi() umgewandelt und PortB=i_value zugewiesen. Sind die Zahlen aber größer als 9 erzeugt atoi() irgendwie nix brauchbares. Bei der Zahl 10 wird scheinbar in 1 und 0 aufgeteilt. Die Zahl 123 wird scheinbar in 1 und 23 aufgeteilt.
Das Programm ist im Moment zunächst erst eine Vorstufe zu einer einfachen Protokollimplementation. Ich will zunächst erst einmal testen, wie ich denn aus Strings Integer-Werte erzeugen kann.
Wie müßte ich denn mein Porgramm verändern damit es richtig funktioniert. Es wäre schön wenn mir da jemand helfen könnte.
Hier mein Quelltext:
Code:#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <avr/io.h> #include <avr/delay.h> #include <avr/interrupt.h> #include <avr/signal.h> char pc_data[3]; char *pointer=pc_data; unsigned char receive_char; unsigned char sendflag; // Initialisierung UART void uart_init (void) { /* USART-Init 38400 Baud bei 8MHz für Mega32 */ UCSRB = ( (1<<RXCIE) | (1<<RXEN) | (1<<TXEN) ); /* Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit */ UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); UBRRH = 0; // Highbyte ist 0 UBRRL = 12; // Lowbyte ist 51 ( dezimal ) } // Zeichen senden int uart_putc(unsigned char c) { while (!(UCSRA & (1<<UDRE))); /* warten bis Senden moeglich */ UDR = c; /* sende Zeichen */ return 0; } // String senden void uart_puts (char *s) { while (*s) { /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */ uart_putc(*s); s++; } } //Zeichen empfangen uint8_t uart_getc (void) { while (!(UCSRA & (1<<RXC))); // warten bis Zeichen verfuegbar return UDR; // Zeichen aus UDR an Aufrufer zurueckgeben } SIGNAL (SIG_UART_RECV) { receive_char=1; } // Erzeugt ASCII-Werte und sendet diese and den PC void toascii_8 (uint8_t uvalue) { char pos1=0; char rest1=0; char pos2=0; char pos3=0; pos1=uvalue/100; uart_putc(pos1+48); rest1=uvalue%100; pos2=rest1/10; uart_putc(pos2+48); pos3=rest1%10; uart_putc(pos3+48); uart_putc(' '); } int main() { uint8_t var; uint8_t i; uint8_t i_value; DDRB=255; PORTB=0; uart_init(); sei(); i=0; while (1) { if(receive_char==1) { while (!(UCSRA & (1<<RXC))); { pc_data[i]=UDR; i++; if(i>2) { i=0; } } receive_char=0; sendflag=0; } if(receive_char==0&&sendflag==0) { //uart_puts(pc_data); //i_value=atoi(pointer); //Funktioniert auch nicht richtig i_value=atoi(pc_data); PORTB=i_value; toascii_8(i_value); //Ausgabe als ASCII i=0; sendflag=1; } } }
Lesezeichen