Hallo zusammen,
ich möchte die RTC meines STM32L476 über den UART einstellen können.
Die RTC arbeitet mit Hex Zahlen für die Uhr, so steht zum Beispiel 0x14
für 14 Uhr.
Ich benutzte die HAL Bibliotheken. Für die Eingabe nutze ich die
Funktion HAL_UART_Recieve.
Ich weiß aber nicht wie ich der Funktion sage das die eingegebene Zahl
eine Hex und keine Dec Zahl ist, und alles über switch cases zu machen
ist sehr aufwändig.
Habt ihr Erfahrungen, Tipps für mich?
Danke schon mal im Voraus
ROWTAG schrieb:> Habt ihr Erfahrungen, Tipps für mich?
es gibt bei der Übertragung keine Hex-Zahlen.
Entweder wird ein String übertragen 4 Byte "0x14" oder es wird da Byte
(8bit).
Oder meinst du sogar Oktal zahlen 0x14?
ROWTAG schrieb:> Die Funktion schreibt in einen uint8_t Buffer also 1 Byte.
dann musst du dir überlegen, wie du sich über UART übertragen will.
Menschen lesbar (String) oder als Byte wert.
Bei einen String kannst du sie mit atoi() in ein Byte umwandeln.
ROWTAG schrieb:> Ich will es so machen das der Benutzer die Zahl 14 für 14 Uhr eingeben> kann.
also String -> atoi() macht dann die Umwandlung. Geht auch mit fscanf().
ROWTAG schrieb:> Die RTC arbeitet mit Hex Zahlen für die Uhr, so steht zum Beispiel 0x14> für 14 Uhr.
Klingt für mich eher nach BCD Zahlen. Hex 0x14 wären m.E. nämlich 0d20.
Und umgedreht wäre dann 0x0E eine dezimale 14.
ROWTAG schrieb:> Funktioniert nicht ganz, wenn ich Stunde=14 eingebe kommt 11 Uhr raus
sicher?
( Stunde[0]-'0' ) << 4
Stunde[0] ist '1' -
damit ist Stunde[0]-'0' = 1
und
1 << 4 = 16
also eine 11 kann nicht rauskommen.
ROWTAG schrieb:> Hab es noch paar mal probiert. Es kommt immer 20Uhr raus.
Dann wird das auch durch häufigeres Probieren nicht besser.
Die Uhr erwarte die Eingabe wohl doch nicht als BCD sondern als hex,
i.e. du musst deine ASCII-Eingabe erst einmal in hex umwandeln, als "14"
-> 0x0e
ROWTAG schrieb:> Allzu viel helfen mir die zahlen nicht weiter
Schreib mal statt:
if(HAL_UART_Receive(&huart2,&helpHours,2,15000)!=HAL_OK)
das hier:
if(HAL_UART_Receive(&huart2,helpHours,2,15000)!=HAL_OK)
oder das hier:
if(HAL_UART_Receive(&huart2,&helpHours[0],2,15000)!=HAL_OK)
Ich habe den Verdacht, über die serielle Schnitte sind die Zeichen '4'
und '0' gekommen und haben den Pointer überschrieben...
EDIT:
uint8_t* helpHours, helpMinutes;
Du solltest natürlich für diesen Buffer nicht nur irgendeinen Pointer
reservieren, sondern auch Speicherplatz....
uint8_t helpHours[5], helpMinutes[5];
In helpHours steht offenbar Müll.
Wo hast du Speicher für den String reserviert? Warum übergibst du der
Receive-Funktion die Adresse eines Zeigers? Sollte das nicht die Adresse
eines Buffers sein?
Ahoi, Martin
ROWTAG schrieb:> Sieht für die Einstellung der RTC so aus> stimestructure.Hours = 0x14;> stimestructure.Minutes = 0x20;> stimestructure.Seconds = 0x00;
dann frag am besten den der so einen müll verzapft hat ...
und wenn du einen uint8_t hast
kann das als alles mögliche intepretiert werden.
( hex , dec , bin, ascii ... usw )
wichtig ist das du das weißt!
Ich würde gerne dazu mal den kompletten code sehen ...
Vermutung ist das du was falsch übergibst und das struct mit stunden in
dezimal super klarkommt.
was der teil dafür sprcht:
Peter II schrieb:> ROWTAG schrieb:>> Hab es noch paar mal probiert. Es kommt immer 20Uhr raus.>> du hast den Debugger - schau nach was wann wo drin steht.
denn bei übergabe der "14" zu -> 0x14 kommt 20uhr herraus
Lothar M. schrieb:> if(HAL_UART_Receive(&huart2,&helpHours[0],2,15000)!=HAL_OK)
So und mit reserviertem Speicherplatz klappt es wenn ich die Stunde
allein mache. Wenn ich aber Minuten und Sekunden nach gleichem Schema
hinzufüge kommt wieder nur Käse raus:
Eingabe war 14:14.13
Ausgabe: 13:14.01
ROWTAG schrieb:> So und mit reserviertem Speicherplatz klappt es wenn ich die Stunde> allein mache. Wenn ich aber Minuten und Sekunden nach gleichem Schema> hinzufüge kommt wieder nur Käse raus:
Prosa hilft hier nicht. Zeig bitte den Code.
ROWTAG schrieb:> So und mit reserviertem Speicherplatz klappt es wenn ich die Stunde> allein mache. Wenn ich aber Minuten und Sekunden nach gleichem Schema> hinzufüge kommt wieder nur Käse raus:>> Eingabe war 14:14.13> Ausgabe: 13:14.01
Fehler gefunden. Bin einfach zu blöd um Code richtig zu kopieren -.-
ROWTAG schrieb:> Eingabe war 14:14.13> Ausgabe: 13:14.01
Du hast irgendwie Versatz da drin. Im Ernst: mit ein wenig "drüber
nachdenken" kommt man da schon drauf. Und der angenehme Nebeneffekt ist:
das "Lernen".
ROWTAG schrieb:> Nur der Monat wir nicht als Zahl sonder als als Char nach dem Muster> sdatestructure.Month = RTC_MONTH_JANUARY;> abgespeichert.
Und wie wird der Monat über die Schnittstelle übertragen?
Warum probierst du es nicht ganz einfach genau so wie bei den
restlichen Zahlen?
Der Entwickler wird sich schon nicht bei jeder Stelle was Neues
ausgedacht haben...
Und tatsächlich, es ist wie bei den Stunden und den Minuten auch. Sieh
dir mal die Definition dieser Konstanten an:
http://www.disca.upv.es/aperles/arm_cortex_m3/curset/STM32F4xx_DSP_StdPeriph_Lib_V1.0.1/html/group___r_t_c___month___date___definitions.html
Lothar M. schrieb:> Im Ernst: mit ein wenig "drüber> nachdenken" kommt man da schon drauf. Und der angenehme Nebeneffekt ist:> das "Lernen".
Das ist mir durchaus klar. Aber nach etlichen Stunden nachdenken und
ausprobieren ist man echt gefrustet.
Das mit den Monaten probier ich jetzt bisschen allein.