Forum: Mikrocontroller und Digitale Elektronik UART String senden


von Donni D. (Gast)


Lesenswert?

Ich mal wieder ;p
Ich wollte grad die Funktion meiner UART-Methoden erweitern und hab die 
Funktion hinzugefügt, einen String zu senden. Er soll mir einen String 
senden, sobald er etwas vom PC empfangen hat. Dies löse ich mit dem 
Interrupt. Wenn ich ein einzelnes Zeichen sende funktioniert das auch 
prima, doch wenn ich einen String zurücksenden möchte bekomme ich eine 
Endlosschleife.. Kann mir wer sagen woran dass liegt? Hier der Code:
1
#define F_CPU 16000000UL
2
#define BAUD 9600UL
3
#define MYUBRR F_CPU/16/BAUD-1
4
5
#include <avr/io.h>
6
#include <avr/delay.h>
7
#include <avr/interrupt.h>
8
9
void UART_init( unsigned int ubrr );
10
void UART_transmit( char send );
11
void UART_transmitString( char *s );
12
char UART_recive( void );
13
14
int main(void)
15
{
16
  sei();
17
  UART_init(MYUBRR);
18
    while(1)
19
    {
20
    
21
    }
22
}
23
24
void UART_init( unsigned int ubrr ) 
25
{
26
  // BAUD-Rate
27
  UBRR0H = (unsigned char) (ubrr >> 8);
28
  UBRR0L = (unsigned char) ubrr;
29
  
30
  // Senden/Empfangen aktivieren
31
  UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);
32
  
33
  // 1 Stop-Bit und 8 Data-Bits
34
  UCSR0C = (3 << UCSZ00);
35
}
36
37
void UART_transmit( char send ) 
38
{
39
  // Warte auf leeren Transmitter-Buffer
40
  while( !(UCSR0A & (1 << UDRE0)));
41
  UDR0 = send;
42
}
43
44
void UART_transmitString(char *s)
45
{
46
  while(*s)
47
  {
48
    UART_transmit(*s);
49
    s++;
50
  }
51
}
52
53
char UART_recive( void )
54
{
55
  // Auf Daten warten
56
  while( !(UCSR0A & (1 << RXC0)));
57
  
58
  // Daten zurückgeben
59
  return UDR0;
60
}
61
62
ISR(USART_RX_vect)
63
{
64
  UART_transmitString("Hallo Welt!");
65
}

von Stefan E. (sternst)


Lesenswert?

Donni Donis schrieb:
> Wenn ich ein einzelnes Zeichen sende funktioniert das auch
> prima,

Glaube ich nicht. Wenn du bei dem Code das Senden des Strings durch ein 
Senden eines einzelnen Zeichen ersetzt, hast du immer noch eine 
"Endlosschleife". Es ist übrigens in Wirklichkeit eher ein 
"Endlos-Interrupt", weil du das empfangene Zeichen nicht ausließt.

von Donni D. (Gast)


Lesenswert?

Ahhh, daran lag es, ich muss dass Zeichen erst einmal Auslesen. Es ging 
mit einem Zeichen, weil ich die Methode wie folgt benutzt hab:
UART_transmitString(UART_recive());
Hab jetzt einfach vorher einmal das Zeichen abgefragt und jetzt 
funktioniert es.
Dankeschön :)

von Stefan E. (sternst)


Lesenswert?

Nur mal so nebenbei: es heißt "receive".

von Stefan (Gast)


Lesenswert?

Warum benutzt Du nicht printf?

Schau mal, wie ich das da gemacht habe: 
http://stefanfrings.de/avr_io/SERIAL-IO-Modul_v1.3.2.zip (in 
serialconsole.c)

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.