Variabelinhalt über UART senden

Gast #855679
Lesenswert?

Hallo,
ich habe folgendes Problem mit meinem Mikrokontroller-Programm (Atmega 
32).

Das folgende Programm soll einen String über die serielle Schnittstelle 
an den PC senden:
1
//Sendet einen String
2
void send_string(unsigned char *data) {
3
  while (*data) {
4
    while (!(UCSRA & (1<<UDRE)));
5
      UDR = *data;
6
    data++;
7
  }
8
}

Wenn ich dieses Programm z.B. mit send_string("Hallo!") aufrufe, 
funktioniert alles einwandfrei.
Auch wenn ich das Programm folgendermaßen aufrufe funktioniert es:
1
unsigned char senden;
2
senden = "Hallo!";
3
send_string(senden);

Nun zum eigentlichen Problem. In die Variable senden soll das 
geschrieben werden, was über die serielle Schnittstelle empfangen wurde, 
sodass das empfangene wieder zurück gesendet wird.

Dazu benutze ich folgenden Syntax:
1
unsigned char senden;
2
senden = recive_char();
3
send_string(senden);

Leider wird so nichts zurückgesendet.

Hier mal die Prozedur recive_char und die Variabeldeklenationen:
1
//Globale Variabeln deklarieren
2
volatile unsigned char uart_buffer[UART_MAX_BUFFER];  //Puffervariable
3
volatile int uart_read_pointer = 0;            //UART-Pointer (Lesen)
4
volatile int uart_write_pointer = 0;          //UART-Pointer (schreiben)
5
----------------------------------------------------------------
6

7

8
//USART-Interrupt (Ringpuffer)
9
ISR(USART_RXC_vect) {
10
  if (uart_buffer[uart_write_pointer] == 0) {
11
    uart_buffer[uart_write_pointer] = UDR;
12
    uart_write_pointer++;
13
    if (uart_write_pointer > UART_MAX_BUFFER) {
14
      uart_write_pointer = 0;
15
          }
16
  }
17
}
18
 
19
 
20
 
21
 
22
//Verarbeitet ein eingelesenes Zeichen (mit Puffer)
23
unsigned char recive_char(void) {
24
  int recived_char = 0;
25
  if (uart_read_pointer > UART_MAX_BUFFER) {
26
    uart_read_pointer = 0;
27
  }
28
  if (uart_buffer[uart_read_pointer] != 0) {
29
    recived_char = uart_buffer[uart_read_pointer];
30
  }
31
  uart_buffer[uart_read_pointer] = 0;
32
  uart_read_pointer++;
33
  return recived_char;
34
}

Habt Ihr eine Idee, woran dies liegen könnte??
Ich verzweifle hier fast.

Im Voraus schonmal Danke für Eure Hilfe!!
Gast #855689
Lesenswert?

>Auch wenn ich das Programm folgendermaßen aufrufe funktioniert es:

>unsigned char senden;
>senden = "Hallo!";
>send_string(senden);

Das funktioniert nicht und der Compiler haut dir jede Menge
Fehlermeldungen um die Ohren.

>Dazu benutze ich folgenden Syntax:

>unsigned char senden;
>senden = recive_char();
>send_string(senden);
>Leider wird so nichts zurückgesendet.

recive_char() empfängt nur ein Zeichen.
Ein String besteht aber aus mindestens zwei Zeichen.

Denk mal über unsigned char senden[N_ZEICHEN]; nach ;)
#855692
Lesenswert?

starwatcher wrote:
>
1
> unsigned char senden;
2
> senden = "Hallo!";
3
> send_string(senden);
4
>
Auch wenn das zufälligerweise funktioniert, es gibt mindestens eine 
Warnung ("assignment makes integer from pointer without a cast" oder so 
ähnlich). So was macht man einfach nicht. In C gibt es keinen Datentyp 
string und deshalb ist das Murks.
#855697
Lesenswert?

starwatcher wrote:
> Ja, ich bekomme diese Warnung angezeigt.
Und ignorierst sie einfach? Ganz toll! Genau dafür sind Warnungen da...

> Aber wie mache ich das ganze vernünftig???
> Ich bin Anfänger in C!!!
Dann hast Du hoffentlich auch ein gutes Buch über C und kannst darin mal 
nachschauen, was es mit Arrays auf sich hat.
#855706
Lesenswert?

Ach, und noch was: Für Strings nimmt man keine unsigned char sondern 
einfach char . char ist der Standardtyp für Textzeichen und 
Bibliotheksfunktionen zur Stringverarbeitung benutzen ebenfalls char , 
weshalb es zumindest zu unschönen Warnmeldungen kommen kann, wenn man 
solchen Funktionen etwas anderes übergibt...
#855849
Lesenswert?

starwatcher wrote:
> Danke für deine schnelle Antwort.
>
> Ja, ich bekomme diese Warnung angezeigt.
>
> Aber wie mache ich das ganze vernünftig???
> Ich bin Anfänger in C!!!

Z.B. so:

unsigned char senden[7];   //Array zur Aufnahme der einzelnen Character 
+ 1
strcpy (senden, "Hallo!"); //Library function, die die Zeichen in das 
Array             //kopiert

... nur als Appetizer ... den Rest musst Du Dir wirklich unter Arrays, 
Strings und library functions zur String Verarbeitung anlesen.

Viel Spass- da mussten wir (leider) alle durch ...!

Grüsse

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