Forum: PC-Programmierung [C] uint8_t und spriftf()


von Marten K. (grashalm4)


Lesenswert?

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

von Nicolai H. (buchanan120)


Lesenswert?

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.

von mh (Gast)


Lesenswert?

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.

von Felix U. (ubfx)


Lesenswert?

Marten K. schrieb:
> was würdet ihr tun? char nehmen?

Die Frage ist doch: warum willst du uint8_t nehmen?

von Marten K. (grashalm4)


Lesenswert?

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]

von Rolf M. (rmagnus)


Lesenswert?

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
von PittyJ (Gast)


Lesenswert?

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.

von Marten K. (grashalm4)


Lesenswert?

okay, macht sinn.
Wie würdest du dann casten?
    char s[] ="Hallo \r\n";
    tx_com( (uint8_t*)s, sizeof(s));

so ?

von Felix U. (ubfx)


Lesenswert?

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
von Marten K. (grashalm4)


Lesenswert?

habs verstanden, vielen Dank :)

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
Noch kein Account? Hier anmelden.