Hender
06.04.2006, 20:01
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:
#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;
}
}
}
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:
#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;
}
}
}