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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.