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;
    	}
    }  
}