Forum: Mikrocontroller und Digitale Elektronik int richtig in char* konvertieren


von Christoph H. (christoph_b)


Lesenswert?

Hallo

Ich habe eine Funktion die mir Daten über ein RFM22B Modul sendet.
1
rf22_sendpacket((unsigned char*)"Hallo",5);
das senden eines Strings klappt.
Nun will ich einen Int wert versenden. Wie konvertiere ich einen in Wert 
richtig in einen char* Wert?

im Internet lese ich immer wieder was von folgende Funktion.
1
char *  itoa ( wert(sizeof(int)*8+1),10);

Ich habs zuerst so probiert
1
   char buf[8];
2
   sprintf(buf,"%05u",wert);
3
  *data=buf;
4
  rf22_sendpacket((unsigned char*)buf,size);

leider will das nicht so recht

von marius (Gast)


Lesenswert?

Hallo,

probiers mal mit

sprintf(char*,"%d",integer);

gruß
Marius

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Christoph B. schrieb:
>
1
> char *  itoa ( wert(sizeof(int)*8+1),10);
2
>

Hallo!
Das versteh ich grad nicht.

>
1
>    char buf[8];
2
>    sprintf(buf,"%05u",wert);
3
>   *data=buf;
4
>   rf22_sendpacket((unsigned char*)buf,size);
5
>

OK, das versteh ich, und es sollte auch funktionieren. :-)
Statt 'size' in der letzten Zeile solltest du 5 einsetzen - oder besser: 
strlen(buf). Ich kenn die Funktion rf22_sendpacket nicht, vielleicht 
reicht auch die Zahl 0 statt 'size'.

Falls dein Programm auf einem Mikrocontroller läuft, wunder dich nicht, 
wenn sprintf() langsam arbeitet, die Funktion ist nicht sonderlich gut 
dafür geeignet. Grundsätzlich ist eine Übertragung der Zahl im 
Binärformat performanter - falls das in diesem Fall in Frage kommt.

von J.-u. G. (juwe)


Lesenswert?


von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

P.S.: Was bedeutet hier '*data=buf;'? Wozu hast du das eingebaut?

von Christoph H. (christoph_b)


Lesenswert?

hallo

leider bekomme ich über USART folgendes

00452

00453

00454

00455
00456

00457
uws

Teilweise ist ein Leerzeichen dazwischen teilweise nicht
bei rf22_sendpacket((unsigned char*)"Hallo",5)
schaut es so aus
Hallo
Hallo
Hallo
Hallo
usw

ups das *data=buf; gehört hier nicht rein.

was gibt es sonst für eine Möglichkeit??

von marius (Gast)


Lesenswert?

marius schrieb:
> Hallo,
>
> probiers mal mit
>
> sprintf(char*,"%d",integer);
>
> gruß
> Marius

von Karl H. (kbuchegg)


Lesenswert?

marius schrieb:
> marius schrieb:
>> Hallo,
>>
>> probiers mal mit
>>
>> sprintf(char*,"%d",integer);
>>

ziemlicher Unsinn

von Karl H. (kbuchegg)


Lesenswert?

> Teilweise ist ein Leerzeichen dazwischen teilweise nicht

zeig mal den Code.


> >   rf22_sendpacket((unsigned char*)buf,size);

Hast du hier noch size stehen, oder hast du das schon korrigiert? 
strlen(buf) wäre richtig.

von Christoph H. (christoph_b)


Lesenswert?

sprintf(char*,"%d",integer);
ok das klappt schonmal.
1
void rf22_sendpacket_int(unsigned int wert,unsigned char size) 
2
{  
3
  unsigned char *data;
4
  unsigned char i;
5
6
  if (size>64) size=64;
7
  
8
  rf22_write(0x07, 0x03);    // switch to ready mode
9
  rf22_read(0x03);      // clear interrupt status
10
  rf22_read(0x04);      // clear interrupt status
11
12
  rf22_write(0x08, 0x01);    // clear TX fifo
13
  rf22_write(0x08, 0x00);    // clear TX fifo
14
  
15
  rf22_write(0x34, 32);    // premable length: 32 nibbles -> 128 Bits
16
  rf22_write(0x3e, size);    // packet length
17
  
18
  for (i = 0; i<size; i++)
19
  {    
20
    rf22_write(0x7f, *data++);
21
  }
22
  
23
  rf22_write(0x05, 0x04);    // enable packet send
24
  rf22_write(0x07, 0x09);    // TX on
25
  
26
  while (nIRQ);
27
  
28
  rf22_write(0x07, 0x01);    //  switch to ready mode
29
  
30
  char buf[8]; // puffer für den String
31
  sprintf(buf,"%d",wert); // wandelt eine Zahl in einen String mit 5 Stellen
32
  rf22_sendpacket((unsigned char*)buf,strlen(buf));
33
}

von marius (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
>>> sprintf(char*,"%d",integer);
>>>
>
> ziemlicher Unsinn

Kannst du das bitte konkretisieren?

von Karl H. (kbuchegg)


Lesenswert?

marius schrieb:
> Karl Heinz Buchegger schrieb:
>>>> sprintf(char*,"%d",integer);
>>>>
>>
>> ziemlicher Unsinn
>
> Kannst du das bitte konkretisieren?

Ganz einfach. Was soll das sein? Das ist noch nicht mal einigermassen 
korrekte Syntax. Seit wann werden an dieser Stelle bei einem 
Funktionsaufruf Datentypen angegeben?

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Christoph B. schrieb:

>   rf22_write(0x07, 0x03);    // switch to ready mode
>   rf22_read(0x03);      // clear interrupt status
>   rf22_read(0x04);      // clear interrupt status

Wirklich 'read'?
Ich hab keine Ahnung von den rf22-Funktionen, aber das erscheint mir 
nicht logisch...

von Karl H. (kbuchegg)


Lesenswert?

Christoph B. schrieb:
> ok das klappt schonmal.

Gut.

Gibts noch ein Problem, oder wars das?

Mit itoa gehst genauso


   char buf[8]; // puffer für den String
   itoa( wert, buf, 10 );
   rf22_sendpacket((unsigned char*)buf,strlen(buf));

itoa hat an dieser Stelle den Nachteil, oder Vorteil (je nachdem), dass 
es keine führenden 0-en generiert. Und die sind auch nicht so einfach zu 
ergänzen wie bei sprintf. Wenn das kein Problem ist, dann ist itoa dein 
Mann.

von Christoph H. (christoph_b)


Lesenswert?

das problem mit den Leerstellen bleibt.

von Karl H. (kbuchegg)


Lesenswert?

Am besten schreibst du dir ein paar Hilfsfunktionen
1
void rf22_sendString( const char* str )
2
{
3
  rf22_sendpacket((unsigned char*)str, strlen(str));
4
}
5
6
void rf22_sendInt( int value )
7
{
8
  char buffer[10];
9
  itoa( value, buffer, 10 );
10
  rf22_sendString( buffer );
11
}

dann bist du die Details des Sendens für einzelne Datentypen los.

von Char (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ganz einfach. Was soll das sein? Das ist noch nicht mal einigermassen
> korrekte Syntax. Seit wann werden an dieser Stelle bei einem
> Funktionsaufruf Datentypen angegeben?

Bleib mal ganz ruhig. Er wollte damit sicherlich nur den Datentyp der 
einzusetztenden Variable angeben. So hab ich es zumindest verstanden.

von Karl H. (kbuchegg)


Lesenswert?

Christoph B. schrieb:
> das problem mit den Leerstellen bleibt.

Von wo wird die Funktion aufgerufen?
Aus der Funktion stammen die Leerzeichen nicht (genausowenig wie die 
Zeilenvorschübe)

von marius (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ganz einfach. Was soll das sein?

Das war ein Beispiel, was Christoph W. anscheinend verstanden und 
angewendet hat. Funktioniert hat es anscheinend auch und das Problem ist 
gelöst.
Manchmal ist ein durchdachtes Beispiel eben sinnvoller, als inhaltlich 
100%ig richtiges Fachchinesisch. Auch wenns evtl am Ego kratzt...

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Aus der Funktion stammen die Leerzeichen nicht (genausowenig wie die
> Zeilenvorschübe)

Seh ich genauso. Ich könnt mir denken, dass das Programm, das für den 
Empfang der Daten verwendet wird, automatisch einen Zeilenvorschub 
einfügt, wenn ein paar Millisekunden lang keine neuen Daten kommen.

von Karl H. (kbuchegg)


Lesenswert?

marius schrieb:
> Karl Heinz Buchegger schrieb:
>> Ganz einfach. Was soll das sein?
>
> Das war ein Beispiel, was Christoph W. anscheinend verstanden und
> angewendet hat.

Das glaub ich nicht
Er hat sein Posting mitlerweile verändert, die ursprüngliche Antwort auf 
dein Posting war: Da bekomme ich aber 6 Fehler

> Manchmal ist ein durchdachtes Beispiel eben sinnvoller, als
> inhaltlich 100%ig richtiges Fachchinesisch.

Eben. Pass dein Beispiel auf die Variablen an, die er benutzt und gut 
ists.

Damit, dass du deine eigenen Syntaxabkürzungen verwendest, hilfst du 
keinem

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.