HEX Zahlen über UART STM32

Gast #5212964
Lesenswert?

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
Gast #5213048
Lesenswert?

Hab es noch paar mal probiert. Es kommt immer 20Uhr raus.
1
static void RecieveTime(void)
2
{
3
  RTC_TimeTypeDef stimestructureget;
4
  RTC_TimeTypeDef help;
5
  uint8_t* helpHours, helpMinutes;
6

7

8
  HAL_UART_Transmit(&huart2,"\n\rHours:",10,100 );
9
  if(HAL_UART_Receive(&huart2,&helpHours,2,15000)!=HAL_OK)
10
  {
11
    _Error_Handler(__FILE__, __LINE__);
12
  }
13

14
//Minuten und Sekunden wurden der Anschaulichkeit entfernt
15
 
16
  stimestructureget.Hours = ( helpHours[0]-'0' ) << 4 | helpHours[1] - '0';
17

18

19
  if(HAL_RTC_SetTime(&hrtc,&stimestructureget,RTC_FORMAT_BCD) != HAL_OK)
20
    {
21
      uint8_t error[]="\n\r Fehler2 \n\r";
22
     HAL_UART_Transmit(&huart2, error, 20, 100);
23
    }
24

25
}
Gast #5213088
Lesenswert?

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
Moderator (Firma: Titel) Persönliche Seite #5213089
Lesenswert?

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];
Gast #5213092
Lesenswert?

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
Gast #5213108
Lesenswert?

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
Gast #5213115
Lesenswert?

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
Gast #5213119
Lesenswert?

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 -.-
Gast #5213132
Lesenswert?

Für tag und Jahr funktioniert es auch super.
Nur der Monat wir nicht als Zahl sonder als als Char nach dem Muster
1
 sdatestructure.Month   = RTC_MONTH_JANUARY;
abgespeichert.

Hab es mal mit einem switch versucht, das klappt aber irgendwie auch 
nicht so wirklich.
1
 
2
static void RecieveDate(void)
3
{
4
  RTC_DateTypeDef sdatestructureget;
5

6
  uint8_t helpMonth, helpDate[5], helpYear[5];
7

8
  
9
  HAL_UART_Transmit(&huart2,"\n\rMonth:",10,100 );
10
  /*if(HAL_UART_Receive(&huart2,&helpMonth,2,20000)!=HAL_OK)
11
  {
12
    _Error_Handler(__FILE__, __LINE__);
13
  }*/
14

15

16

17
  switch(helpMonth)
18
  {
19
  case 1: sdatestructureget.Month   = RTC_MONTH_JANUARY; break;
20
  case 2: sdatestructureget.Month   = RTC_MONTH_FEBRUARY; break;
21
  case 3: sdatestructureget.Month   = RTC_MONTH_MARCH; break;
22
  case 4: sdatestructureget.Month   = RTC_MONTH_APRIL; break;
23
  case 5: sdatestructureget.Month   = RTC_MONTH_MAY; break;
24
  case 6: sdatestructureget.Month   = RTC_MONTH_JUNE; break;
25
  case 7: sdatestructureget.Month   = RTC_MONTH_JULY; break;
26
  case 8: sdatestructureget.Month   = RTC_MONTH_AUGUST; break;
27
  case 9: sdatestructureget.Month   = RTC_MONTH_SEPTEMBER; break;
28
  case 10: sdatestructureget.Month   = RTC_MONTH_OCTOBER; break;
29
  case 11: sdatestructureget.Month   = RTC_MONTH_NOVEMBER; break;
30
  case 12: sdatestructureget.Month   = RTC_MONTH_DECEMBER; break;
31
  default: HAL_UART_Transmit(&huart2, "ERROR Month",20,100); break;
32
  }
33

34
  sdatestructureget.Date  = ( helpDate[0]-'0' )   << 4 | helpDate[1] - '0';
35
  sdatestructureget.Year  = ( helpYear[0]-'0' )   << 4 | helpYear[1] - '0';
36

37

38
  if(HAL_RTC_SetDate(&hrtc,&sdatestructureget,RTC_FORMAT_BCD) != HAL_OK)
39
    {
40
      /* Initialization Error */
41
      uint8_t error[]="\n\r Fehler1 \n\r";
42
      HAL_UART_Transmit(&huart2, error, 20, 100);
43
   //   Error_Handler();
44
    }
45

46
}
Moderator (Firma: Titel) Persönliche Seite #5213146
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren