Empfangen/Senden char Array

OP #2481299
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
  }
}

------------------------------------------------------------------------ 
--
#2481321
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.
#2481350
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.
#2481362
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
}
#2481374
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.
#2481445
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.

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