mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Array aus Variablen bauen


Autor: Nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo alle,

die Frage mag sehr easy erscheinen, aber ich komme gerade nicht weiter.
Ich habe ein Array bestehend aus 6 Bytes.
volatile unsigned char send[6] = { 0,0,0,0,0,0 };

Dazu noch 6 Variablen, die ich ins Array packen will und das Array 
nachher per UART verschicken.
Das ganze weil der von mir benutzte uC schneller die Arrays verschickt 
als einzelne Bytes hintereinander.
volatile unsigned char a,b,c,d,e,f;

So, nun könnte ich einfach
send[0] = a;
send[1] = b;
send[2] = c;
usw schreiben, aber das sieht mir zu komisch aus.

Welche Möglichkeit gibt es, das eleganter zu machen?

Vielen Dank
Schönes Wochenende

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nils schrieb:
> Welche Möglichkeit gibt es, das eleganter zu machen?

Man könnte anstelle der sechs Variablen gleich die Arrayelemente 
verwenden.

Autor: Nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Man könnte anstelle der sechs Variablen gleich die Arrayelemente
>verwenden.
Vielen Dank, warum bin ich bloß drauf nicht selbst gekommen.

Noch eine Frage, wenn ich darf:
eine der Variable ist int aus 4 Bytes.
also
unsigned char a = 0x11;
unsigned int b = 0x112233
unsigned char c = 0x00;
unsigned char d = 0x33;

Wie macht man das?

Autor: Arduinoquäler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nils schrieb:
> Wie macht man das?

Wie macht man was?

Nils schrieb:
> eine der Variable ist int aus 4 Bytes.

So wie du es definierst, nicht zwingend .....

unsigned int

ist auf einem AVR 16 Bit, auf einem ARM 32 Bit "groß".

Autor: Georg G. (df2au)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Nils schrieb:
> Wie macht man das?

Am besten nicht machen. Denn dafür ist dein Array zu klein.

Ansonsten
a[0] = irgendein_Byte;
a[1] = 24_bit-var;
a[4] = noch_was_als Byte;
usw.

Autor: Nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das funktioniert leider nicht.
send[1] ist korrekt
send[2] und send[3] wurden nicht übernommen.

Autor: Arduinoquäler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nils schrieb:
> Das funktioniert leider nicht.

Du sprichst in Rätseln. Was funktioniert leider nicht?

Nils schrieb:
> send[1] ist korrekt
> send[2] und send[3] wurden nicht übernommen.

Du sprichst in Rätseln.

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Georg G. schrieb:
> Ansonsten
> a[0] = irgendein_Byte;
> a[1] = 24_bit-var;
> a[4] = noch_was_als Byte;
> usw.

Wenn der Typ von a kleiner als der, der 24_bit-var ist, wird nicht der 
gesammte Wert übernommen.

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine (packed) struct wäre auch eine Lösung.

Autor: Nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, sorry.
Noch mal:
volatile unsigned char send [6] = { };
volatile unsigned char Wert_a = 0x11;
volatile unsigned int Wert_b = 0x223344;
volatile unsigned char Wert_c = 0x55;
volatile unsigned char Wert_d = 0x66;

send[0] = Wert_a;
send[1] = (Wert_b << 8);
send[4] = Wert_c;
usw...

Die Daten in send[2] und send[3] sind falsch. Und zwar 0, wie bei der 
Initialisierung

Danke

Autor: Georg G. (df2au)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dirk B. schrieb:
> Wenn der Typ von a kleiner als der, der 24_bit-var ist, wird nicht der
> gesammte Wert übernommen.

Dann mach einen Cast. Unsauber ist es eh.

Autor: Arduinoquäler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Arduinoquäler schrieb:
> So wie du es definierst, nicht zwingend .....
>
> unsigned int
>
> ist auf einem AVR 16 Bit, auf einem ARM 32 Bit "groß".

Beratungsresistenz ist eine Zier,
doch weiter kommt man ohne ihr.

Autor: Georg G. (df2au)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nils schrieb:
> send[0] = Wert_a;
> send[1] = (Wert_b << 8);
> send[4] = Wert_c;

Wo ist die Zuweisung zu send[2] und send[3]?
Und noch einmal: wie gross ist dein unsigned int?

Autor: Nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der uC hat einen Cortex 32-Bit Kern.
Die unsigned int ist 4 Bytes lang

Autor: Nils (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im moment ist das so: (und das funktioniert)
send[0] = Wert_a;
send[1] = (Wert_b >> 16);
send[2] = ((Wert_b >> 8) & 0x00FF);
send[3] = (Wert_b & 0x0000FF);
send[4] = Wert_c;
send[5] = Wert_d;
das sieht mir aber zu "schlecht" aus.

Autor: Arduinoquäler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nils schrieb:
> Die Daten in send[2] und send[3] sind falsch. Und zwar 0, wie bei der
> Initialisierung

Nils schrieb:
> Im moment ist das so: (und das funktioniert)

Na was jetzt, so oder so?

Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nils schrieb:
> der uC hat einen Cortex 32-Bit Kern.
> Die unsigned int ist 4 Bytes lang

Siehste, und da stößt du auf deine Probleme!

Also dann rechne mal, du hast Wert_a (1Byte), Wert_b (4Byte), Wert_c 
(1Byte), Wert_d (1Byte)... Das sind schonmal 7 Byte. Also brauchst du 
bei einem Char Array mindestens ein Größe von 7.

char send[7];


Dann teilst du deinen 32byte Integer einfach mit Bitshiften auf 
send[1-4] auf.

send[0,5,6] weißt du dann halt die Char Wert_a/c/d zu und fertig. Auf 
dem Zielsystem shiftest du dann halt byte 1-4 wieder "zusammen".

Autor: Draco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nils schrieb:
> send[1] = (Wert_b >> 16);
> send[2] = ((Wert_b >> 8) & 0x00FF);
> send[3] = (Wert_b & 0x0000FF);

Nils schrieb:
> Die unsigned int ist 4 Bytes lang


Merkst du deinen Fehler denn nicht selbst?!

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nils schrieb:
> das sieht mir aber zu "schlecht" aus.

Das ist aber der richtige Weg.

Autor: Jim Meba (turboj)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nils schrieb:
> send[0] = Wert_a;
> send[1] = (Wert_b >> 16);
> send[2] = ((Wert_b >> 8) & 0x00FF);
> send[3] = (Wert_b & 0x0000FF);
> send[4] = Wert_c;
> send[5] = Wert_d;
> das sieht mir aber zu "schlecht" aus.

Geht kaum anders. Wert_b wird nicht aligned und auch noch Big Endian 
übertragen (und die obersten 8 Bit abgeschnitten). Cortex M3 ist aber 
little endian.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.