Hallo,
ich arbeite mich gerade mit dem NUCLEO Board L476RG in die STM32 Welt
ein.
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?
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.
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.
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.
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.
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?
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
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_HandleTypeDefhuart2;
2
3
uint8_tmy_data[2]={123,45};// 12345 aufgeteilt in 2 Bytes
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.
OMG schrieb:> In Wirklichkeit möchtest du einen String an ein Terminal> senden ..... und vorher einen ADC Wert in diesen String drucken.
Ja genau. Kannst du mir bitte ein Beispiel geben wie ich das am Besten
mache?
M. G. schrieb:> ich arbeite mich gerade mit dem NUCLEO Board L476RG in die STM32 Welt> ein.
Nach den hier von der Leserschaft gewonnenen Erkenntnissen
ist es wohl angebracht sich erst mal in die Welt der
C-Programmierung einzuarbeiten.
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.
>> Mit float habe ich kein Problem jedoch bekomme ich in der Zeile>
1
>intlen=(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);
Niklas Gürtler schrieb:> M. G. schrieb:>> error: initializer element is not constant">> Steht das vielleicht außerhalb einer Funktion?!
Ja, Danke!
Es stand in meinem Fall außerhalb von main()...
> noch immer die Fehlermeldung "error: initializer element is not> constant"
Einfach die Zeile splitten - der Compiler mag nur kostanten als
Initializer.
U.G. L. schrieb:> Einfach die Zeile splitten - der Compiler mag nur kostanten als> Initializer.> int len;> sprintf(buffer,"Temp = %3.1f°C\n",temp);
Schwachsinn. Die Lösung steht schon weiter oben.
leo