Forum: Compiler & IDEs Variabelinhalt über UART senden


von starwatcher (Gast)


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!!

von holger (Gast)


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

von Johannes M. (johnny-m)


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.

von starwatcher (Gast)


Lesenswert?

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!!!

von Johannes M. (johnny-m)


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.

von holger (Gast)


Lesenswert?

>Aber wie mache ich das ganze vernünftig???

Du musst dich mit dem Thema Arrays und Pointer beschäftigen.

von Johannes M. (johnny-m)


Lesenswert?

BTW (nur ganz am Rande): receive schreibt sich mit 3 'e'... Nur weil 
ich das hier schon öfter falsch gesehen habe.

von Johannes M. (johnny-m)


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...

von starwatcher (Gast)


Lesenswert?

Danke für Eure Antworten.

Mit Array uns Pointer kenne ich mich ein wenig aus, aber leider weiß ich 
nicht, wie ich das ganze jetzt auf mein Problem Anwenden kann.

von John S. (student)


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

von Karl H. (kbuchegg)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.