Hallo zusammen,
Board: STM32F4-Discovery
Bib: STM32
IDE: Atolic Truestudio
Aufgabe:
möchte durch USART-Schnittstelle vom PC an STM32 die Parameter für
PWM-Signal (Servo-Motoren) senden. Der STM32 soll string auslesen evtl.
in int umwandeln und CCR1, CCR2, CCRn.. Wert verändern/stellen.
Aktueller Stand:
USART Interrupt
Frage:
Wie kann ich "received_str" zerlegen? z.B. ich sende vom Computer
MP11500
dies soll interpretiert werden als: CCP1 auf Wert 1500 setzen oder
MP31000: CCP3 auf Wert 1000 setzen.
Wie kann ein Beispielcode dafür aussehen?
Vielen Dank!
Grüß, Nik
Du kannst erstmal gucken, ob der String mit "MP" beginnt. Dann machst Du
einen switch-case auf das nächste Zeichen, das '1', '2', '3' oder so
sein kann. Aufgepaßt, '1' ist nicht der integer 1.
Die Zahlenumwandlung kannst Du mit atoi() machen, was einen String
erwartet. Der Wert kommt ab Positon 3, also value =
atoi(received_str+3).
Das als Anregungen.
Diese ganze string Bearbeitung auf einem uC ist doch murks. Sende per
uart doch gleich die hex Werte der Zahlen. Größere Werte kannst du doch
zerlegen und zusammen führen.
Will dir damit nur sagen, daß du Dir erstmal grundlegende Gedanken über
das protokol machen solltest.
Ein Byte als qualifier und dann payload plus am Ende ein Trennzeichen.
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.
Nikita J. schrieb:> Vielen herzlichen Dank für eure Vorschläge! Ich werde mich an diesen> Wochenende dies ausprobieren!>> Grüße, Nik
Bitte poste einmal Deine Ergebnisse, denn Du fertig bist - ich wollte
auch schon einmal immer so etwas programmiert haben.
Viele Grüße
Igel1