int richtig in char* konvertieren

OP #2551055
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
(Firma: guloshop.de) #2551091
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.
OP #2551113
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??
OP #2551138
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
}
#2551165
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.
#2551171
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.
Gast #2551172
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.
Gast #2551179
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...
#2551197
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.