HEX Zahlen über UART STM32

Gast #5212964
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
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?
Gast
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.
Gast
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'
Gast
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.
Gast
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
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
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
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.