STM32 - 16Bit Integer Wert über UART senden

Gast #5838313
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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 #5838336
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
}
#5838516
Lesenswert?

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

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