STM32 - 16Bit Integer Wert über UART senden

Gast #5838313
die HAL_Uart erwartet einen pointer

bei 8N1 werden nur 8 bit gesendet
also übergibst du ihm einfach deinen 16mit wert und castest auf 8bit mit 
der länge 2


kurz gesagt:

uint16_t wert;

HAL_UartSend( UART1 , (uint8_t*) &wert , 2 );

MSB/LSB ist architekturabhängig.. also aufpassen.
Gast #5838317
M. G. schrieb:
> Gibt es eine einfache Möglichkeit mittels HAL Library einen 16Bit
> Integer Wert über die UART zu senden? Oder muss ich diesen Wert in 8Bit
> Werte vorher zerlegen?

Du solltest neben der HAL Doku unbedingt auch mit dem Reference-Manual 
arbeiten 
https://www.st.com/content/ccc/resource/technical/document/reference_manual/3d/6d/5a/66/b4/99/40/d4/DM00031020.pdf/files/DM00031020.pdf/jcr:content/translations/en.DM00031020.pdf

Die UART Schnittstelle kann laut Kapitel 30.2 nur 8 oder 9 Bits 
übertragen, wobei das 9. Bit normalerweise für die Parität verwendet 
wird.

Also: 16bit geht nicht.
#5838325
gre schrieb:
> Jim M. schrieb:
>> Was hängt auf der anderen Seite dran?
>>
>> Bei einem Terminal will man nämlich eher eine der *printf() Funktionen
>> benutzen, um den Wert in ASCII zu wandeln.
>
> Dann wäre die fragestellung eine andere gewesen.

Die Fragestellung suggeriert, daß der TE gar keine Ahnung hat. 
Binärdaten per UART verschicken ist eher ungewöhnlich und zu 99% nicht 
das, was er will.
Gast #5838329
gre schrieb:
> uint16_t wert;
>
> HAL_UartSend( UART1 , (uint8_t*) &wert , 2 );

arrays:
uint8_t array[16];
HAL_UartSend( UART1 , array , 16 );


structs
typedef struct{
  uint8_t  a;
  uint32_t b;
  uint8_t  *c
}mystruct_t;

mystruct_t my;
HAL_UartSend( UART1 , (uint8_t*) &my  , sizeof(mystruct) );
Gast #5838330
gre schrieb:
> Dann wäre die fragestellung eine andere gewesen.

Manche Fragesteller sind jedoch so naiv dass sie die Frage
erst gar nicht korrekt stellen können. Daher halte ich die
Nachfrage von turboj für durchaus berechtigt.

Jim M. schrieb:
> Was hängt auf der anderen Seite dran?
Gast #5838336
Axel S. schrieb:
> Die Fragestellung suggeriert, daß der TE gar keine Ahnung hat.
> Binärdaten per UART verschicken ist eher ungewöhnlich und zu 99% nicht
> das, was er will.

das interpretierst du , ok.
KANN sein , muss aber nicht

binärdaten sind nicht so unüblich /( Modbus , zig andere Protokolle )
UART heißst nicht immer konsole.


und wenn er keine ahnung hat, dann sollte er sich dadurch angeregt 
fühlen seine frage richtig zu stellen.

zB:  ich möchte einen 16bit wert über uart senden und auf eine konsole 
am PC anzeigen
OP #5838411
Ja, meine Fragestellung war nicht ganz korrekt...
Also ich möchte einen 12Bit ADC-Wert einlesen, in eine Temperatur 
umwandeln und per UART an ein Hyperterminal senden.

Das Senden von 2 Bytes des Arrays my_data funktioniert bereits.
Wie aber sende ich die Daten im ASCII Format zb. Temp = 24,8°C?
1
UART_HandleTypeDef huart2;
2

3
uint8_t my_data[2] = {123, 45};  // 12345 aufgeteilt in 2 Bytes
4

5

6
int main(void)
7
{
8
  HAL_Init();
9
  SystemClockConfig();    // optional
10
  UART2_Init();
11

12
  uint8_t my_data_length = 2;
13

14
  while(1)
15
  {
16
    if (HAL_UART_Transmit(&huart2, (uint8_t*)my_data, my_data_length, HAL_MAX_DELAY) != HAL_OK)
17
    {
18
      Error_handler();
19
    }
20

21
    HAL_Delay(1000);
22
  }
23

24
  return 0;
25
}
Gast #5838432
M. G. schrieb:
> Ja, meine Fragestellung war nicht ganz korrekt...
> Also ich möchte einen 12Bit ADC-Wert einlesen, in eine Temperatur
> umwandeln und per UART an ein Hyperterminal senden.

Ja, deine Fragestellung ist immer noch nicht korrekt. Danach
möchtest du einen ADC-Wert an ein Hyperterminal senden. Was
keinen Sinn macht. Und darf es auch ein Nicht-Hyper-Terminal sein?

In Wirklichkeit möchtest du einen String an ein Terminal
senden ..... und vorher einen ADC Wert in diesen String drucken.
Gast #5838509
Ich sags ja:

OMG schrieb:
> erst mal in die Welt der
> C-Programmierung einzuarbeiten.

probiers mal hiermit (in etwa):
1
void Temperature_Out (int16_t  temperature)
2
{
3
  float  f_temp;
4
  char   tmpstr[30];
5
  uint16_t  my_data_length;
6

7
  f_temp = (float) temperature;  // irgendwas korrekt umrechnen
8

9
  sprintf (tmpstr, " Temp: %5.2f°C (ADC val: %d) \r\n", f_temp, temperature);
10
  my_data_length = strlen (tmpstr);
11

12
  HAL_UART_Transmit(&huart2, (uint8_t*)tmpstr, my_data_length, HAL_MAX_DELAY);
13

14
}
#5838513
Stefanus F. schrieb:
> int len=(buffer,"Temp = %3.1f°C\n",temp);

int len=sprintf(buffer, "Temp = %3.1f°C\n", temp);

Das hat der Stefan wohl vergessen.
Außerdem musst du berücksichtigen, dass ° nicht Teil von ASCII ist und 
daher wahrscheinlich falsch angezeigt wird. Im Zweifelsfall ersetzt du 
das durch ein Leerzeichen.
#5838516
M. G. schrieb:
> Stefanus F. schrieb:
>>
1
>>    float temp=24.8;
2
>>    char buffer[20];
3
>>    int len=(buffer,"Temp = %3.1f°C\n",temp);
4
>>
>
> Mit float habe ich kein Problem jedoch bekomme ich in der Zeile
>
1
> int len=(buffer,"Temp = %3.1f°C\n",temp);
2
>
> die Fehlermeldung "error: initializer element is not constant"


Da fehlt wohl noch das "sprintf " ...

int len=sprintf(buffer,"Temp = %3.1f°C\n",temp);

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 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.