Forum: Mikrocontroller und Digitale Elektronik Arduino: Formatierung von Binärzahl


von Lisa-Marie (Gast)


Lesenswert?

Hallo,

bräuchte mal einen Tipp für den Arduino:

int a=2;
String y = String(a,BIN);
Serial.println(y); // Ausgabe: 10

Was muss man einfügen, dass statt der Ausgabe: 10
entweder  00000010 oder 0000000000000010
erscheint.

Vielen Dank !

von Kurt Krampmeier (Gast)


Lesenswert?

Die Funktion utoa() sollte Dir hier helfen können. Hier gibt's schönen 
Beispielcode, der die führenden Nullen hinzufügen kann:

https://forum.arduino.cc/t/ausgabe-mittels-sprintf-im-binarformat-nicht-moglich/256590/2

von Veit D. (devil-elec)


Angehängte Dateien:

Lesenswert?

Hallo,

ich hatte mir auch einmal sowas gebastelt. Mit optionalen Trennzeichen 
zur besseren Lesbarkeit. Länge der Zeichen ist abhängig vom Datentyp. 
Den Ordner myToolbox einfach ins libraries Verzeichnis kopieren. Ggf. 
IDE neu starten wenn unter Beispiele nichts auftaucht.

von Lisa-Marie (Gast)


Lesenswert?

Danke allen.
lm

    int a=15;
    String y = String(a,BIN);
    int l = String(a,BIN).length();
    for(l; l<16; l++){
        y = "0" + y;}
    Serial.println(a);
    Serial.println(y);

von Veit D. (devil-elec)


Lesenswert?

Hallo,

das mit der String Klasse gewöhnste dir auf dem kleinen AVR am Besten 
gleich wieder ab. Nimm char Arrays. Sonst kommst du früher oder später 
in Probleme.

von EAF (Gast)


Lesenswert?

Veit D. schrieb:
> ....
Etwas zu pauschal.

Naja, kann man schon mit arbeiten.
Auf den Kleinen hilft dabei global anlegen und die Größe mit 
String::reserve() vorbesetzen.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

kann man machen nur dann muss man ggf. irgendwann wieder umdenken. 
Programmiert man gleich alles was solche Dinge betrifft mit char Arrays 
erspart man sich Probleme und Code umschreiben. Obliegt jedem selbst. 
Wollte auch nur gewarnt haben.

von Stefan F. (Gast)


Lesenswert?

Unabhängig von Arduino und maximal portierbar:
1
#include <stdio.h>
2
#include <stdint.h>
3
#include <stdbool.h>
4
5
int main()
6
{
7
    uint8_t zahl=2;
8
    // uint16_t zahl=2;
9
    // uint32_t zahl=2147483647;    
10
 
11
    int bits = sizeof(zahl)*8;
12
    for (int i=0; i<bits; i++)
13
    {
14
        bool msb = zahl & (1<<bits-1);
15
        putchar('0'+msb);
16
        zahl = zahl<<1;
17
    }
18
19
    putchar('\n');
20
}

Alternativ, aber zumindest auf AVR vermutlich langsamer ist:
1
    for (int i=bits-1; i>=0; i--)
2
    {
3
        bool bit = zahl & (1<<i);
4
        putchar('0'+bit);
5
    }

Der Unterschied ist, dass der untere Code eine Shift-Operation mit 
variabler Anzahl von Schritten enthält. Da AVR keinen Barrel-Shifter 
haben, muss der C-Compiler dies durch eine innere Wiederholschleife 
umsetzen.

von Veit D. (devil-elec)


Lesenswert?

Hallo,

vielleicht eine dumme Frage, aber das läuft vermutlich nur auf dem PC, 
oder? Wie kommt die Ausgabe auf die Serielle? Unabhängig bedeutet doch 
läuft überall?

von Stefan F. (Gast)


Lesenswert?

Veit D. schrieb:
> aber das läuft vermutlich nur auf dem PC, oder?

In der Tat habe ich das Programm nur auf einem Laptop getestet. Für 
serielle/usb Ausgaben musst du bei Arduino die Methoden der Serial 
Klasse benutzen, anstatt putchar().

Für serielle Ausgabe auf AVR Mikrocontroller ohne Arduino Framework habe 
ich ein Beispiel: http://stefanfrings.de/avr_hello_world/index.html

> Unabhängig bedeutet doch läuft überall?

Das "unabhängig" bezog sich auf den Algorithmus.

von Veit D. (devil-elec)


Lesenswert?

Stefan ⛄ F. schrieb:
> Veit D. schrieb:
>> Unabhängig bedeutet doch läuft überall?
>
> Das "unabhängig" bezog sich auf den Algorithmus.

Das ist der Punkt den ich wissen wollte und warum ich irritiert war.
Alles klar, alles gut. Danke.

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.