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 } } ------------------------------------------------------------------------ --
- 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.
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.
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.
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 | }
|
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.