Nikita J. schrieb:
> Aktueller Stand:
>
> USART Interruptvoid USART2_IRQHandler() {
> ...
> if ((input != '\n') && (cnt < MAX_WORDLEN)) {
> received_str[cnt++] = input;
Du schreibst Murks.
Trenne doch die logschen Ebenen voneinander, sonst verhedderst du dich
noch viel mehr.
Wie man sowas richtig macht, kannst du in der Lernbetty nachlesen,
alternativ in diversen geposteten Quellen von mir.
Sene- und Empfangs-Verfahren:
- der Interrupthandler behandelt die Hardware: er sendet Zeichen aus dem
Sende-Ringpuffer und empfängt Zeichen, die er in den Empfangs-Ringpuffer
schreibt. Er bewertet die Inhalte NICHT.
- die von außen sichtbaren Funktionen des seiellen Treibers nehmen zu
sendende Zeichen entgegen und stopfn sie in den Sende-Ringpuffer und sie
geben empfangene Zeichen aus dem Empfangs-Ringpuffer an die aufrufenden
Programmteile. Sie befassen sich NICHT mit der Hardware und sie bewerten
auch die Inhalte NICHT.
Kommando-Verfahren:
Variante A:
Es gibt ein Kommandoprogramm, das eine Funktion enthält, welche aus der
Grundschleife zyklisch aufgerufen wird. Diese Funktion fragt den
seriellen Treiber ab, ob Empfangszeichen vorliegen, sortiert diese in
einen Kommandopuffer und sendet ein Echo der Zeichen zurück. Sie kann
auch diverse Editierfunktionen haben. Ist der Puffer voll oder ist ein
Enter (CR oder LF oder was auch immer) erkannt, dann ruft sie die
eigentliche Kommandofunktion auf, welche die Kommandozeile analysiert
und entsprechend ausführt.
Variante B:
Es gibt ein Kommandoprogramm, das eine Funktion enthält, welche aus der
Grundschleife zyklisch aufgerufen wird. Diese Funktion fragt den
seriellen Treiber ab, ob Empfangszeichen vorliegen, wertet das aktuelle
Zeichen aus und führt die zugehörigen Funktionen aus.
Diese Variante B ist nicht für HMI geeignet, aber für schnelle
Maschinenkommunikation. Mal ein Beispiel für nen Plotter:
120.5X92.0YD200X20YU
macht nen Strich von x=120.5, y=92 nach x=200, y=20
W.S.