Mahlzeit, Ich Programmiere einen STM32 Controller in STM CubeIDE. Die Sprache ist C. Welchen Datentyp verwendet ihr für Strings? ich würde uint8_t[] nehmen.. uint8_t s[50]; sprintf(s,"Hallo "); Wirft mir folgende Warning: pointer targets in passing argument 1 of 'sprintf' differ in signedness [-Wpointer-sign] was würdet ihr tun? char nehmen? beste Grüße
https://docs.microsoft.com/de-de/cpp/c-runtime-library/reference/sprintf-sprintf-l-swprintf-swprintf-l-swprintf-l?view=vs-2019 int sprintf(char *buffer, const char *format [argument]...); Ich nutze üblicherweise char. Steht so auch in der Doku zu sprintf.
Marten K. schrieb: > Welchen Datentyp verwendet ihr für Strings? ich würde uint8_t[] nehmen.. char (ohne signed oder unsigned) für ascii kodierte Texte.
Marten K. schrieb: > was würdet ihr tun? char nehmen? Die Frage ist doch: warum willst du uint8_t nehmen?
weil ich zB eine Methode habe die strings in uint8_t erwartet ... static void tx_com(uint8_t *tx_buffer, uint16_t len) { HAL_UART_Transmit(&huart2, tx_buffer, len, 1000); } könnte ich natürlich abändern, aber HAL_UART_Transmit benötigt auch uint8_t : HAL_StatusTypeDef HAL_UART_Transmit (UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size, uint32_t Timeout) [aus : Description of STM32L4/L4+ HAL]
Marten K. schrieb: > weil ich zB eine Methode habe die strings in uint8_t erwartet ... Die erwartet einen Rohdaten-Puffer. Da ist ein Zeiger auf uint8_t ja passend. Es muss ja kein String sein, den du überträgst. Was man also macht ist, dass man es an der Stelle, wo man die Daten an diese Funktion übergibt, umwandelt, wofür in diesem Fall ein Cast reicht. Sprich: Intern für Strings immer char nehmen und dann an der einen Stelle, an der man es für die Ausgabe an die Lowlevel-Funktion übergibt, wird nach uint8_t gecastet.
:
Bearbeitet durch User
Rolf M. schrieb: > Marten K. schrieb: >> weil ich zB eine Methode habe die strings in uint8_t erwartet ... > > Sprich: Intern für Strings immer char nehmen und dann an der einen > Stelle, an der man es für die Ausgabe an die Lowlevel-Funktion übergibt, > wird nach uint8_t gecastet. So mache ich das auch. Ergab bisher die wenigsten Probleme.
okay, macht sinn. Wie würdest du dann casten? char s[] ="Hallo \r\n"; tx_com( (uint8_t*)s, sizeof(s)); so ?
Marten K. schrieb: > okay, macht sinn. > Wie würdest du dann casten? > char s[] ="Hallo \r\n"; > tx_com( (uint8_t*)s, sizeof(s)); > > so ? Der cast ist richtig, statt sizeof() aber strlen() oder sizeof()-1 wenn die Größe zur Compilezeit bekannt ist. Das Nullbyte wirst du im Allgemeinen nicht mitübertragen wollen.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.