Forum: Mikrocontroller und Digitale Elektronik UART String senden/empfangen


von Sepp H. (vali1991)


Lesenswert?

Hallo,

ich möchte gerne einen String mit beliebiger länger senden und empfangen 
(UART) können. Der String welcher empfangen wird, der soll wieder 
gesendet werden (Terminal String senden, Mikrocontroller empfängt und 
schickt wieder an Terminal). Komme nicht weiter, was mach ich falsch?

Würde mich über Antworten freuen, danke.

MfG Sepp


-----------------------------------------------------------------
1
#include <avr/io.h>
2
3
#define F_CPU 3686400ul
4
#define BAUD 9600
5
#define UBRR_VAL = ((3686400/(9600*16))-1)
6
7
void uart_tx();
8
char* string[]; 
9
unsigned char* str;
10
11
void uart_init(void) {
12
    UBRR0H = 0x00;
13
  UBRR0L = 0x17;    
14
15
 
16
    UCSR0B = (1<<TXEN0) | (1<<RXEN0);  // UART TX und RX einschalten
17
    UCSR0C = (1<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00);  // Asynchron 8N2 
18
}
19
20
int main(void) {
21
  uart_init();
22
  uart_tx(str);
23
  uart_rx();
24
}
25
26
void uart_rx(unsigned char *str) {
27
  while (!(UCSR0A & (1<<RXC0))) {    //warten bis Zeichen verfuegbar
28
  }
29
    str = UDR0++;
30
}
31
32
void uart_tx(unsigned char *str) {
33
  while(*str != 0) {
34
    while (!(UCSR0A & (1<<UDRE0))) {   // warten bis Senden moeglich
35
    }
36
      UDR0 = *str++;             //Zeichen für Zeichen wird übertragen        
37
  }
38
}
-----------------------------------------------------------

von Karl H. (kbuchegg)


Lesenswert?

Das hier
1
char* string[];

ist keine Speicherfläche, in der man einen String beliebiger Länge 
abspeichern kann.
Du musst deine Ansprüche zurückschrauben. Beliebige Länge geht nicht. 
Setz dir eine Obergrenze (zb 80 Zeichen) und leb damit.

und wie man auf eine derartige Idee kommen kann, ist mir auch nicht ganz 
klar:
1
void uart_rx(unsigned char *str) {
2
  while (!(UCSR0A & (1<<RXC0))) {    //warten bis Zeichen verfuegbar
3
  }
4
    str = UDR0++;
5
}
http://www.mikrocontroller.net/articles/String-Verarbeitung_in_C

> Komme nicht weiter, was mach ich falsch?

Dir fehlen (immer noch) alle C-grundlagen, die man in einem C-Buch 
finden und lernen kann. Aber das hab ich dir vor Wochen schon mal 
gesagt.

von Achim M. (minifloat)


Lesenswert?

Sepp Horst schrieb:
> str = UDR0++;

was wird denn das, wenns fertig ist? Nee mal im Ernst, sind bei dir 
C-Grundlagen zur µC-Programmierung vorhanden?

Für die Empfangsoutine: Ich würde erst den ganzen String in einem Puffer 
auffangen, bis ein '\n' empfangen wird. Dann wird eine Variable zur 
Synchronisation beider Prozesse gesetzt und der String mit '\0' 
abgeschlossen.

Die Senderoutine prüft, ob die Synchronisationsvariable gesetzt ist. 
Wenn ja, wird der String "ausgespuckt" und die Sync-Variable 
rückgesetzt.

Was auch gut wäre: mit mehreren Puffern arbeiten.

mfg mf

von MWS (Gast)


Lesenswert?

Sepp Horst schrieb:
> str = UDR0++;

Erst holst Du den Wert aus dem UDR, speicherst in str, nachher erhöhst 
Du den Wert um 1 und schreibst in UDR zurück. Interessante Funktion :D

Karl Heinz Buchegger schrieb:
> und wie man auf eine derartige Idee kommen kann, ist mir auch nicht ganz
> klar:

Schneller gewesen...

von Sepp H. (vali1991)


Lesenswert?

Ich weiß, dass ich wenige Grundlagen in C besitze, dennoch möchte ich 
gerne ein einfach Programm erstellen. Danke für den Link!!

von Sepp H. (vali1991)


Lesenswert?

danke für die tipps

von Karl H. (kbuchegg)


Lesenswert?

Sepp Horst schrieb:
> danke für die tipps

Der wichtigste:

kauf dir ein C-Buch und arbeite das erste Drittel auf einem PC mit einem 
PC-Compiler durch!
Du führst einen 2-Fronten Krieg, den du nicht gewinnen kannst: 
Gleichzeitig C lernen und die Besonderheiten der µC-Programmierung geht 
sehr oft in die Hose.

Investier die Zeit lieber, dir erst mal auf dem PC ein solides 
Grundgerüst an C-Kentnissen zu holen. PC deswegen, weil dann alle 
Beispiel und Übungen aus jedem beliebigen Standard-C-Lehrbuch einfach so 
funktionieren. Konkret: weil dort die I/O Library schon fertig und 
funktionsfähig ist, was sie auf einem µC eben nicht ist. D.h. du 
schlägst dich erst mal nicht mit irgendwelchen Hardwaredingen rum, 
sondern kannst dich auf C konzentrieren.

von Sepp H. (vali1991)


Lesenswert?

AVR - RISC von Roman Mittermayr, ist das ein guter Anfang?

von Karl H. (kbuchegg)


Lesenswert?

Aus der Produktbeschreibung

[Zitat]
Sie bekommen eine kurze Einführung in die Sprache Assembler und lernen 
außerdem die wichtigsten Grundlagen der C-Programmierung kennen.
[/Zitat]

IMHO, ohne das Buch genauer zu kennen: Nein.

Die wichtigsten Grundlagen sind zu wenig.
202 Seiten, was bleibt dann neben der AVR-Programmierung für Assembler 
und C übrig?
Ein C Buch hat für sich schon mindestens diesen Umfang (behandelt aber 
zugegebenermassen dann aber auch Themen, die auf einem AVR-µC eher 
nebensächlich sind, wei zb File-IO)

von Karl H. (kbuchegg)


Lesenswert?

Das hier
http://openbook.galileocomputing.de/c_von_a_bis_z/
soll ganz gut sein.

Und dann natürlich der Klassiker
Programmieren in C
Kernighan & Ritchie
(wenn geht aber in Englisch lesen)

aber nicht einfach nur lesen und abnicken. Auf dem PC üben! Gute Bücher 
haben am Ende jedes Kapitels immer Übungsaufgaben.

von ich (Gast)


Lesenswert?

Sepp Horst schrieb:
> AVR - RISC von Roman Mittermayr

Das ist eigentlich nur eine grobe Zusammenstellung, die er 
wahrscheinlich hier im Forum abgeschrieben hat... wie Fahrschule, nur 
ohne Verkehrszeichen eben.

von Purzel H. (hacky)


Lesenswert?

Bei Strings sollte man sich ueberlegen ob man den C-Furz durchziehen 
will, dh mit einem Null am Ende, oder ob man die Laenge am Anfang 
uebertragen soll.

von Walter S. (avatar)


Lesenswert?

Nano Oschi schrieb:
> Bei Strings sollte man sich ueberlegen ob man den C-Furz durchziehen
> will
ein Anfänger sollte auf jeden Fall das verwenden was in allen Büchern 
steht,
als mit der 0 am Ende.
Individualisten können dann später machen was sie wollen

von Karl H. (kbuchegg)


Lesenswert?

Nano Oschi schrieb:
> Bei Strings sollte man sich ueberlegen ob man den C-Furz durchziehen
> will, dh mit einem Null am Ende, oder ob man die Laenge am Anfang
> uebertragen soll.

Weder noch.
Als Anfänger sollte man sich ein String-Ende Zeichen vereinbaren, 
welches aber nicht 0 ist, sondern zb ein Carriage Return.

Dann kann man nämlich mit jedem ordinären Terminal die Funktion des 
µC-Codes testen.

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.