Forum: Mikrocontroller und Digitale Elektronik stm32 und itoa


von Karl (Gast)


Lesenswert?

Hi,

ich habe ein stm32f4 board hier und eine lib aus dem Internet geladen, 
die mir einen virtuellen ComPort erstellt. Die Ausgabe von Strings im 
Terminal funktioniert super, allerdings möchte ich nun integer 
übertragen.

Der Funktion zum Übertragen will char

void usb_cdc_printf(char *s);

Beim AVR habe ich dafür immer itoa über die stdlib verwendet, wie mache 
ich es beim stm32?

Vielen Dank

von Peter II (Gast)


Lesenswert?

Karl schrieb:
> Beim AVR habe ich dafür immer itoa über die stdlib verwendet, wie mache
> ich es beim stm32?

wenn es dort kein itoa gibt(was ich kaum glauben kann) gibt es ja immer 
noch sprintf.

von Moritz M. (Gast)


Lesenswert?

Hallo,

Stichwort -sprintf(..)_

von Karl (Gast)


Lesenswert?

Sorry, aber ich bin im Bereich Hardware zuhause.

Mein Versuch...
1
int counter=5;
2
char s[7];
3
4
sprintf(s,"%d",counter);
5
usb_cdc_printf(&s);

Aber sprintf müsste ich doch auch über eine header einbinden?

Danke

von Peter II (Gast)


Lesenswert?

Karl schrieb:


#include <stdio.h>

von Peter II (Gast)


Lesenswert?

Nachtrag:

> usb_cdc_printf(&s);
sicher das hier %s stehen muss? sieht mir merkwürdig aus.

von Karl (Gast)


Lesenswert?

Peter II schrieb:
> sicher das hier %s stehen muss?

das ist kein Prozent, sonder ein &(und) für die Adresse

der Aufruf
void usb_cdc_printf(char *s);

von Peter II (Gast)


Lesenswert?

Karl schrieb:
> das ist kein Prozent, sonder ein &(und) für die Adresse
>
> der Aufruf
> void usb_cdc_printf(char *s);

ja sorry war ein Tippfehler, aber sprintf braucht auch ein char* und 
dort nimmst du nicht die Adresse! Ein Array ist die Adresse.

von Christian B. (chbalnuweit)


Lesenswert?

Peter II schrieb:
...
> dort nimmst du nicht die Adresse! Ein Array ist die Adresse.

jain... ein Array ohne Angabe des Elements liefert die Adresse auf das 
erste Element des Arrays.

von Karl (Gast)


Lesenswert?

Ah, das macht Sinn...also so
1
int counter=5;
2
char s[7];
3
4
sprintf(s,"%d",counter);
5
usb_cdc_printf(s);

Allerdings habe ich noch Probleme mit der Einbindung der stdio.h

#include <stdio.h> geht nicht, weil die lib wohl bei CooCox nicht zum 
Standard gehört...

Ich habe nun im Internet noch einen Code für itoa gefunden (nicht mein 
code)
1
char * itoa(char * buf, unsigned int val, char pad) {
2
    char i;
3
    char tmp_buf[6];
4
5
    for(i=0; val>0; val/=10)
6
        tmp_buf[i++] = (val % 10) + '0';
7
    if(i==0)
8
        tmp_buf[i++] = '0';
9
10
    while(i<pad)
11
        tmp_buf[i++] = ' ';
12
13
    while(i>0)
14
        *buf++ = tmp_buf[--i];
15
16
    *buf = 0;
17
18
    return buf;
19
}
der Aufruf...
1
usb_cdc_putc(itoa(s,counter,2));

Beim Compilieren gibt es keinen Fehler, aber im Terminal kommt nichts 
-.-

von thegameboy (Gast)


Lesenswert?

Karl schrieb:
> usb_cdc_putc(itoa(s,counter,2));

die funktion wird so nehmme ich mal an nur einen charakter übertragen.. 
aber du hast einen string zu übertragen....


nimm wieder
usb_cdc_printf(&s); <---- oder was auch immer du für einen funktion für 
strings verwendet hast .. man kann nur raten ^^

von Karl (Gast)


Lesenswert?

thegameboy schrieb:
> nimm wieder
> usb_cdc_printf(&s);

Natürlich, gut gesehen... Leider bekomme ich im Terminal auch so nichts.

Das funktioniert...
usb_cdc_printf("Hello World!\n");

jenes nicht
usb_cdc_printf(itoa(s,counter,2));

von thegameboy (Gast)


Lesenswert?

hmm

void UARTPutDec16(uint16_t decnum)
{
  uint8_t c1=decnum%10;
  uint8_t c2=(decnum/10)%10;
  uint8_t c3=(decnum/100)%10;
  uint8_t c4=(decnum/1000)%10;
  uint8_t c5=(decnum/10000)%10;
  usb_cdc_putc('0'+c5);
  usb_cdc_putc('0'+c4);
  usb_cdc_putc('0'+c3);
  usb_cdc_putc('0'+c2);
  usb_cdc_putc('0'+c1);
}



probier das mal

von Karl (Gast)


Lesenswert?

Danke für den Code, es geht in die richtige Richtung...

Im Terminal werden nun Kästchen geschickt...

Weiß nicht wie ich das Zeichen mache, es ist jedenfalls in Hex 81, 17 
,81 ,17....

also eine abwechselnde Folge, allerdings sieht das Kästchen in Ascii 
gleich aus

von Karl (Gast)


Lesenswert?

Mhm, nun habe ich in der Funktion eine eigene Funktion erstellt

void usb_cdc_putint(uint8_t *s){
  VCP_DataTx((uint8_t*)s);
}

Aufruf...
usb_cdc_putint(&counter);

Die Kommunikation funktioniert fast, im Terminal zeigt er als ascii 
wieder nur den Kasten an, aber als Hex, Dec und Binär zeigt er die 
richtige Zahl an.

Ich benutze HTerm als Terminal

von Fabian O. (xfr)


Lesenswert?

Wenn die Funktion ihrem Namen gerecht wird, sollte reichen:
1
usb_cdc_printf("%i", counter);

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.