Hallo,
ich habe folgendes Problem mit meinem Mikrokontroller-Programm (Atmega
32).
Das folgende Programm soll einen String über die serielle Schnittstelle
an den PC senden:
1 | //Sendet einen String
|
2 | void send_string(unsigned char *data) {
|
3 | while (*data) {
|
4 | while (!(UCSRA & (1<<UDRE)));
|
5 | UDR = *data;
|
6 | data++;
|
7 | }
|
8 | }
|
Wenn ich dieses Programm z.B. mit send_string("Hallo!") aufrufe,
funktioniert alles einwandfrei.
Auch wenn ich das Programm folgendermaßen aufrufe funktioniert es:
1 | unsigned char senden;
|
2 | senden = "Hallo!";
|
3 | send_string(senden);
|
Nun zum eigentlichen Problem. In die Variable senden soll das
geschrieben werden, was über die serielle Schnittstelle empfangen wurde,
sodass das empfangene wieder zurück gesendet wird.
Dazu benutze ich folgenden Syntax:
1 | unsigned char senden;
|
2 | senden = recive_char();
|
3 | send_string(senden);
|
Leider wird so nichts zurückgesendet.
Hier mal die Prozedur recive_char und die Variabeldeklenationen:
1 | //Globale Variabeln deklarieren
|
2 | volatile unsigned char uart_buffer[UART_MAX_BUFFER]; //Puffervariable
|
3 | volatile int uart_read_pointer = 0; //UART-Pointer (Lesen)
|
4 | volatile int uart_write_pointer = 0; //UART-Pointer (schreiben)
|
5 | ----------------------------------------------------------------
|
6 |
|
7 |
|
8 | //USART-Interrupt (Ringpuffer)
|
9 | ISR(USART_RXC_vect) {
|
10 | if (uart_buffer[uart_write_pointer] == 0) {
|
11 | uart_buffer[uart_write_pointer] = UDR;
|
12 | uart_write_pointer++;
|
13 | if (uart_write_pointer > UART_MAX_BUFFER) {
|
14 | uart_write_pointer = 0;
|
15 | }
|
16 | }
|
17 | }
|
18 |
|
19 |
|
20 |
|
21 |
|
22 | //Verarbeitet ein eingelesenes Zeichen (mit Puffer)
|
23 | unsigned char recive_char(void) {
|
24 | int recived_char = 0;
|
25 | if (uart_read_pointer > UART_MAX_BUFFER) {
|
26 | uart_read_pointer = 0;
|
27 | }
|
28 | if (uart_buffer[uart_read_pointer] != 0) {
|
29 | recived_char = uart_buffer[uart_read_pointer];
|
30 | }
|
31 | uart_buffer[uart_read_pointer] = 0;
|
32 | uart_read_pointer++;
|
33 | return recived_char;
|
34 | }
|
Habt Ihr eine Idee, woran dies liegen könnte??
Ich verzweifle hier fast.
Im Voraus schonmal Danke für Eure Hilfe!!