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.
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.
Gast
#5838319
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.
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
Gast
#5838343
Falls es um Binärdaten geht: Serialisierung
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
Gast
#5838416
mit sprintf
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.
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?
Gast
#5838461
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
Eventuell musst du den Linker noch überzeugen, die Unterstützung für float zu aktivieren: http://stefanfrings.de/stm32/stm32f1.html#newlib
Gast
#5838479
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: >
1 | |
2 | |
3 | |
4 | |
Mit float habe ich kein Problem jedoch bekomme ich in der Zeile
1 | |
die Fehlermeldung "error: initializer element is not constant"
Gast
#5838509
Ich sags ja: OMG schrieb: > erst mal in die Welt der > C-Programmierung einzuarbeiten. probiers mal hiermit (in etwa):
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
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.
M. G. schrieb: > Stefanus F. schrieb: >>
1 | |
2 | |
3 | |
4 | |
> > Mit float habe ich kein Problem jedoch bekomme ich in der Zeile >
1 | |
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);
Gast
#5838531
S. R. schrieb: > sprintf > Das hat der Stefan wohl vergessen. Huch, das ist irgendwie beim copy/pasten verloren gegangen. Sorry.
Ich habe das jetzt ausgebessert, bekomme aber in der Zeile
1 | |
noch immer die Fehlermeldung "error: initializer element is not constant"
Gast
#5838551
Kann es sein, dass der wahre Fehler sich in den Zeilen darüber versteckt hat?
Gast
#5838557
M. G. schrieb: > error: initializer element is not constant" Steht das vielleicht außerhalb einer Funktion?!
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()...
M. G. schrieb: >
1 | |
2 | |
> noch immer die Fehlermeldung "error: initializer element is not > constant" Einfach die Zeile splitten - der Compiler mag nur kostanten als Initializer.
1 | |
2 | |
Gast
#5839848
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
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.