Forum: Mikrocontroller und Digitale Elektronik HEX Zahlen über UART STM32


von ROWTAG (Gast)


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

von Peter II (Gast)


Lesenswert?

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?

von ROWTAG (Gast)


Lesenswert?

Die Funktion schreibt in einen uint8_t Buffer also 1 Byte.

von Peter II (Gast)


Lesenswert?

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.

von ROWTAG (Gast)


Lesenswert?

Ich will es so machen das der Benutzer die Zahl 14 für 14 Uhr eingeben 
kann.

von Peter II (Gast)


Lesenswert?

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().

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

: Bearbeitet durch User
von ROWTAG (Gast)


Lesenswert?

Sieht für die Einstellung der RTC so aus
1
stimestructure.Hours          = 0x14;
2
stimestructure.Minutes        = 0x20;
3
stimestructure.Seconds        = 0x00;

von Peter II (Gast)


Lesenswert?

ok wenn es bcd ist, dann kann man es auch ganz einfach machen
1
char* Stunde = "14";
2
3
stimestructure.Hours = ( Stunde[0]-'0' ) << 4 | Stunde[1] - '0'

von ROWTAG (Gast)


Lesenswert?

Peter II schrieb:
> ok wenn es bcd ist, dann kann man es auch ganz einfach machen

Schreibt man vor BCD auch "0x"?

von Peter II (Gast)


Lesenswert?

ROWTAG schrieb:
> Schreibt man vor BCD auch "0x"?

man kann zahlen schreiben wie man will. Es ist die Frage wie es 
interpretiert wird.

von ROWTAG (Gast)


Lesenswert?

Peter II schrieb:
>
1
 stimestructure.Hours = ( Stunde[0]-'0' ) << 4 | Stunde[1] - '0'

Funktioniert nicht ganz, wenn ich Stunde=14 eingebe kommt 11 Uhr raus

von Peter II (Gast)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?

ROWTAG schrieb:
> Funktioniert nicht ganz, wenn ich Stunde=14 eingebe kommt 11 Uhr raus
1
int main()
2
{
3
char* Stunde = "14";
4
5
uint8_t x = ( Stunde[0]-'0' ) << 4 | Stunde[1] - '0';
6
7
printf("test = %d\n", x );
8
9
}

bei mir kommt 20 raus was ja 0x14 ist.

von ROWTAG (Gast)


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
}

von Peter II (Gast)


Lesenswert?

ROWTAG schrieb:
> Hab es noch paar mal probiert. Es kommt immer 20Uhr raus.

du hast den Debugger - schau nach was wann wo drin steht.

von ROWTAG (Gast)


Angehängte Dateien:

Lesenswert?

Hab einen Breakpoint nach SetTime gesetzt.

Allzu viel helfen mir die zahlen nicht weiter

von Wolfgang (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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];

: Bearbeitet durch Moderator
von DocMartin (Gast)


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

von ROWTAG (Gast)


Lesenswert?

Funktioniert leider beides nicht. Geht sofort in den Error_Handler

von ROWTAG (Gast)


Lesenswert?

Mit fest reserviertem Speicherplatz funktioniert es doch

von 32zuterrtzkutehte (Gast)


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

von ROWTAG (Gast)


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

von Frank M. (ukw) (Moderator) Benutzerseite


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:

Prosa hilft hier nicht. Zeig bitte den Code.

von ROWTAG (Gast)


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 -.-

von ROWTAG (Gast)


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
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

: Bearbeitet durch Moderator
von Jonas L. (rowtag)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.