Hallo,
ich habe ein Problem neuerdings mit meinem UART.
Ich nutze zum Einlesen einen Interrupt. Die Werte kommen auch alle an,
jedoch bekomme ich nicht die Rückmeldung das der String komplett
eingelesen ist.
h-Datei
1
#ifndef UART0_H_
2
#define UART0_H_
3
4
#define UART0_BAUD 9600
5
#define UART0_BUFFER_MAX_LEN 4 // wichtig fuer diesen Fehler
Problem ist, dass sobald ich bei
static volatile uint8_t uart0_buffer_count;
das static wegnehme, mecker er in der main.c, dass ich die Variablem
mehrmals defeniert hab. Das stimmt so aber nicht. Dort werden die
lediglich abgefragt.
Wenn ich versuche die Stelle zu finden über die Fehlerausgabe in AS6.2,
dann leitet er mich in die uart.c Datei nach dem include der uart.h
Datei.
Aber eigentlich sollte static und/oder extern aber richtig sein.
Du solltest davon Abstand nehmen, in Deinem Uart-Empfangsinterrupt die
Funktion uart0_puts aufzurufen. Lass all diese Ausgaben mal weg, bzw.
verlagere sie in die main().
Hallo Rufus. Mir ist bewusst, dass eine ISR so kurz wie möglich sein
muss.
Das hab ich dort auch NUR reingeschrieben, da ich keinerlei Feedback
bekommen habe, ob überhaupt Zeichen ankommen. Eine Led anschließen kann
ich derzeit leider nicht.
Das Problem hängt scheinbar mit dem Geltungsbereich von Variablen
zusammen.
initialized and declared 'extern' enabled by default
http://openbook.galileo-press.de/c_von_a_bis_z/009_c_funktionen_011.htm#mj19e69aaaa55d4a98fe6073fe2a99a2c6
Demnach sollten aber keine, extern oder static gehen.
mit "static" im Header-File kriegt jedes C-File, dass diesen Header
#included, eine eigene, von allen anderen unabhängige Kopie der Variable
verpasst.
Du willst was anderes: Nur eine Variable, alle C-Files greifen auf
dieselbe zu.
Also: Im headerfile nur "extern", und in einem einzgen C-File die
Variable instanziieren.
in keinem der beiden Files sollte die Variable dabei "static" sein.
Datentyp bei dem Wert vergessen. Denke aber es war zu sehen wie gemeint
;)
Wenn ich i in uart.c defeniere mekert meine main.c immer noch, dass es
bereits deklariert ist.
Error 3 'uart_str_complete' undeclared (first use in this function)
C:\...\main.c
Samuel schrieb:> uart.h> extern volatile uint8_t uart_str_complete = 0;> extern volatile char uart_string[UART_MAXSTRLEN + 1] = "";
Initialisierungen gehören nicht in die Headerdatei.
> uart.c> volatile uint8_t uart_str_complete;> volatile char uart_string[];
Da gehört die Initialisierung und vor allem die Größenangabe des Arrays
hin.
> main.c> // Diese Variable bezieht sich auf die extern deklarierten in uart.h> volatile uint8_t uart_str_complete; // 1)
Das hat da gar nichts verloren, stattdessen gehört da ein
#include "uart.h"
hin.
Variablen werden nicht in header-files definiert sondern nur in
Source-Files und das auch nur einmal. Der Rest wird über "extern"
erledigt. Und es gibt kein extern static!
Ingo
Also hab es dann nun geändert.
In der uart.h
die Initialisierung herausgenommen.
Nur in der uart.c die Werte initialisiert.
Für alle anderen h-Files nur noch das einfügen
volatile uint8_t uart_str_complete;
volatile char uart_string[UART_MAXSTRLEN+1];
soweit dann richtig?
Debuggen geht sicher nicht mit einem Strin aus einem Interrupt zu
schreiben. Die Methode der Wahl ist einem Pin zu wackeln und mit dem
Scope zu kontrollieren.
Doch, das "debuggen" mit dem String ging in der ISR wunderbar. Natürlich
ist mir klar, dass dieser dort nichts zu suchen hatte. Aber mir blieb da
keine andere Möglichkeit. Ist inzwischen raus da es funktioniert.