Forum: Mikrocontroller und Digitale Elektronik Empfangen/Senden char Array


von Sepp H. (vali1991)


Lesenswert?

Guten Tag,

ich hab ein kleines Problem beim empfangen bzw. senden von Zeichen. 
Meine Überlegung war die, dass ich im Terminal eine Zeichenkette eingebe 
und dass ich sie danach empfange und in ein char Array schreibe und sie 
anschließend wieder zurück an den Terminal sende.
Worann könnte es liegen?

Wäre nett, wenn mir jemand helfen könnte, danke.

MfG Sepp


------------------------------------------------------------------------ 
--

#include <avr/io.h>

#define F_CPU 3686400ul
#define BAUD 9600
#define UBRR_VAL = ((3686400/(9600*16))-1)

char satz[256];
int i;

void uart_init(void) {
    UBRR0H = 0x00;
  UBRR0L = 0x17;


    UCSR0B = (1<<TXEN0) | (1<<RXEN0);  // UART TX und RX einschalten
    UCSR0C = (1<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00);  // Asynchron 8N2
}

int main(void) {
  uart_init();
  while(1) {
  uartRx();
  uartTx();
  }
}

void uartRx() {
  while(!(UCSR0A & (1<<RXC0))) {
  }
  for(i=0; satz[i] != 0; i++) {
      satz[i] = UDR0;
  }
}

void uartTx() {
    while (!(UCSR0A & (1<<UDRE0))) {   // warten bis Senden moeglich
    }
    for(i=0; satz[i] != 0; i++) {
      UDR0 = satz[i];             //Zeichen für Zeichen wird übertragen
  }
}

------------------------------------------------------------------------ 
--

von Klaus W. (mfgkw)


Lesenswert?

- Beim Lesen prüfst du zuerst, ob satz[i] ungleich 0 ist.
  Das ist es natürlich (weil global und deshalb mit 0
  initialisiert), also wird gleich wieder abgebrochen.
  Sinnvoller wäre, anhand der gelesenen Zeichen abzubrechen,
  z.B. bei einem Zeilenvorschub.

- Der Quelltext ist gruselig formatiert, da sieht man eh
  kaum Fehler.

- Lesen und Schreiben kann nur abwechselnd stattfinden,
  auf Dauer wird das unbefriedigend sein.

- Eine Fehlerbeschreibung wäre sinnvoll gewesen.
  "geht nicht" sagt nicht viel, aber nicht mal dazu hat es
  gereicht.

von Sepp H. (vali1991)


Lesenswert?

Klaus Wachtler schrieb:
> Eine Fehlerbeschreibung wäre sinnvoll gewesen.
>   "geht nicht" sagt nicht viel, aber nicht mal dazu hat es
>   gereicht.

Es lässt sich gar nichts empfangen. Ich gebe im Terminal ein oder 
mehrere Zeichen ein, doch es wird nichts empfangen.

von Karl H. (kbuchegg)


Lesenswert?

Trenn die Dinge!

Du brauchst eine Funktion, die EIN Zeichen empfangen kannst.
Und die benutzt du dann, um mit Hilfe dieser Funktion die Funktionalität 
"empfange einen String" zu implementieren.

Genauso umgekehrt:
Dein unterster Baustein ist eine Funktion die EIN Zeichen verschicken 
kann. Und mit deren Hilfe baust du dann eine Funktion, die einen String 
verschicken kann.

Man kann von einer Funktion auch wieder eine andere Funktion aufrufen, 
die dann einen kleinen Teil der Drecksarbeit macht. Man muss nicht auf 
Biegen und Brechen alles in einer Funktion codieren.

von Karl H. (kbuchegg)


Lesenswert?

Fang mit der Funktion zum Versenden eines Strings (bzw versenden eines 
einzelnen Zeichens an).

Denn: die kannst du testen, auch wenn das empfangen noch nicht 
funktioniert.
1
....
2
3
void uartTxChar( char c )
4
{
5
   // ein einzelnes Zeichen, nämlich c, ausgeben
6
   ...
7
}
8
9
void uartTx( char Text[] )
10
{
11
   ....
12
   benutze uartTxChar um ein Zeichen nach dem anderen von Text
13
   mittles Aufrufen von uartTxChar auszugeben
14
}
15
16
int main()
17
{
18
  uart_init();
19
20
  while(1) {
21
    uartTx( "Hallo Welt\n" );
22
  }
23
24
}

von Karl H. (kbuchegg)


Lesenswert?

Das hier
1
void uartTx() {
2
    while (!(UCSR0A & (1<<UDRE0))) {   // warten bis Senden moeglich
3
    }
4
    for(i=0; satz[i] != 0; i++) {
5
      UDR0 = satz[i];             //Zeichen für Zeichen wird übertragen
6
  }
7
}
zeigt, dass du nicht verstanden hast, wozu man den Teil "warten bis" 
überhaupt braucht!
Dein Programm läuft viiiieeeeel schneller als die UART übertragen kann. 
D.h. du musst bei jedem Zeichen darauf warten, dass die UART wieder 
ein Zeichen aufnehmen kann, nicht nur beim ersten! Eine sinnvolle 
Aufteilung in eine Funktion, die 1 Zeichen verschickt und eine Funktion 
die darauf aufbauend einen String verschickt, macht das ganz von 
alleine.

von Klaus W. (mfgkw)


Lesenswert?

Gibt es eigentlich noch das Tutorial?

von Karl H. (kbuchegg)


Lesenswert?

Natürlich.
Genauso wie es Unmengen an C-Büchern gibt, die ich einem Fragenden "Sepp 
Horst" in den letzten Monaten immer und immer wieder ans Herz gelegt 
habe.

Drum geh ich auch nicht konkreter auf seine Probleme ein. Wenn er bei 
dem, was ich da zeige nichts mehr versteht, dann soll er sich endlich 
ein Buch kaufen und das tun, was er schon seit Monaten tun sollte: von 
der Pieke auf erst mal C und ein wenig allgemeines Programmieren lernen, 
ehe er sich in die Höhle des 'Da ich auf einem µC bin, muss ich erst mal 
im Trüben fischen ehe ich was sehe' einlässt.

von Sepp H. (vali1991)


Lesenswert?

Danke, werd mich weiter damit spielen. =)

von Sepp H. (vali1991)


Lesenswert?

Es funktioniert nun wie ich es wollte!! =)

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.