mikrocontroller.net

Forum: Compiler & IDEs Variabelinhalt über UART senden


Autor: starwatcher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
//Sendet einen String
void send_string(unsigned char *data) {
  while (*data) {
    while (!(UCSRA & (1<<UDRE)));
      UDR = *data;
    data++;
  }
}

Wenn ich dieses Programm z.B. mit send_string("Hallo!") aufrufe, 
funktioniert alles einwandfrei.
Auch wenn ich das Programm folgendermaßen aufrufe funktioniert es:
unsigned char senden;
senden = "Hallo!";
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:
unsigned char senden;
senden = recive_char();
send_string(senden);

Leider wird so nichts zurückgesendet.

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


//USART-Interrupt (Ringpuffer)
ISR(USART_RXC_vect) {
  if (uart_buffer[uart_write_pointer] == 0) {
    uart_buffer[uart_write_pointer] = UDR;
    uart_write_pointer++;
    if (uart_write_pointer > UART_MAX_BUFFER) {
      uart_write_pointer = 0;
          }
  }
}
 
 
 
 
//Verarbeitet ein eingelesenes Zeichen (mit Puffer)
unsigned char recive_char(void) {
  int recived_char = 0;
  if (uart_read_pointer > UART_MAX_BUFFER) {
    uart_read_pointer = 0;
  }
  if (uart_buffer[uart_read_pointer] != 0) {
    recived_char = uart_buffer[uart_read_pointer];
  }
  uart_buffer[uart_read_pointer] = 0;
  uart_read_pointer++;
  return recived_char;
}

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

Im Voraus schonmal Danke für Eure Hilfe!!

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
starwatcher wrote:
>
> unsigned char senden;
> senden = "Hallo!";
> send_string(senden);
> 
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.

Autor: starwatcher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Aber wie mache ich das ganze vernünftig???

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: starwatcher (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: John Schmitz (student)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.