mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C String in uint32 und zurück?


Autor: Alex W. (de1m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

eine Frage an die C Profis

Es geht um die ESP8266, da kann man bestimmte Infos in flash speichern. 
Es sind die 4KB Blöcke und laut Doku sollte es uint32 sein.
So ich möchte z.B "ABCD" speichern und beim nächsten mal wieder lesen.

Ich habe hier was dazu geschrieben, an sich funktioniert es auch, aber 
ich glaube, dass es kein richtiger Weg ist, wenn ich da etwas mehr habe, 
dann wird es umständlich
  uint32 y;
  uint32 x;

  unsigned char buf[4] = "ABCD";
    uint32 frostr = buf[0] + 256U*buf[1] + 65536U*buf[2] + 16777216U*buf[3];

    int i = spi_flash_erase_sector(0x8c);
    os_printf("spi_flash_erase_sector: %d\n", i);
    int o = spi_flash_write(0x8c000, &frostr, sizeof(x));
    os_printf("spi_flash_write: %d\n", o);

    int p = spi_flash_read(0x8c000, &y, sizeof(y));
    os_printf("spi_flash_read: %d\n", p);

    buf[3] = y >> 24;
    buf[2] = y >> 16;
    buf[1] = y >> 8;
    buf[0] = y;

    os_printf("read :%s\n", buf);

Autor: Peter II (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
ich würde es mit memcpy machen.
unsigned char buf[4] = "ABCD";
uint32 frostr;
memcpy( &frostr, buf, sizeof(frostr) );

//und zurück
unsigned char buf2[4];
memcpy( buf, &frostr, sizeof(frostr) );


bist du dir sicher mit buf[4]? Es passen zwar die 4 Buchstaben rein, 
aber nicht die \0. Darfst also keine Stringfunktionen mit dem buf 
aufrufen.

Autor: Alex W. (de1m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter II schrieb:
> bist du dir sicher mit buf[4]

mein Fehler, habe ich vergessen.

Noch eine Frage, wie ist es wenn
buf[32]
 ist, sollte ja genau so gehen oder?

Autor: Peter II (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Alex W. schrieb:
> ist, sollte ja genau so gehen oder?
dafür müsste man mal wissen, wie die Parameter von spi_flash_write 
definiert sind - hast du ein link auf die Doku?

vermutlich kannst du auch einfach so den String übergeben
spi_flash_write(0x8c000, (uint32_t*)buf, 4));

Autor: Alex W. (de1m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die schnelle Hilfe, hat geklappt
So sieht die Funktion aus
  uint32 tosave, toread;
  char ssid[32];
  char ssid2[32];

  os_memcpy(ssid, "CO2", 3);

  int i = spi_flash_erase_sector(0x8c);
  os_printf("spi_flash_erase_sector: %d\n", i);
  int o = spi_flash_write(0x8c000, (uint32*)ssid, sizeof(ssid));
  os_printf("spi_flash_write: %d\n", o);

  int p = spi_flash_read(0x8c000, &toread, sizeof(toread));

  os_memcpy(ssid2, &toread,sizeof(&toread));

  os_printf("Read from flash: %s\n", ssid2);

Aber eine Frage noch )
beim "os_prinf" bekomme ich als Ergebnis "CO2@", hast du vielleicht eine 
Vermutung woher "@" Zeichen kommt?

Autor: Alex W. (de1m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter II schrieb:
> hast du ein link auf die Doku?

Doku gibt es hier 
https://espressif.com/sites/default/files/document...

Autor: Peter II (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Alex W. schrieb:
> Vermutung woher "@" Zeichen kommt?

du schreibst sizeof(buf) und liest aber sizeof(int32). Also nur 4 
Zeichen.

Also 2 Fehler. Ersten schreibst du das \0 nicht mit raus. Musst dir also 
irgendwo merken wie lang der String wirklich ist. Und beim Lesen musst 
du halt die länge angeben oder so lange lesen bis \0 kommt (die du aber 
vorher auch schreiben musst)

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alex W. schrieb:
> Doku gibt es hier
> 
https://espressif.com/sites/default/files/document...

das steht nichts von spi_flash_write

Autor: Alex W. (de1m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Peter II (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alex W. schrieb:
> ah ja, hier aber
> 
https://espressif.com/sites/default/files/document...

ok, dann musst du nur dafür sorgen, das die länge durch 4 Teilbar ist.
spi_flash_write(0x8c000, (uint32*)ssid, sizeof(ssid));
spi_flash_read(0x8c000, (uint32*)ssid, sizeof(ssid));

Autor: Alex W. (de1m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okay, danke für die Hilfe ich versuche es morgen weiter.

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alex W. schrieb:
> Aber eine Frage noch )
> beim "os_prinf" bekomme ich als Ergebnis "CO2@", hast du vielleicht eine
> Vermutung woher "@" Zeichen kommt?

Peter II schrieb:
> aber nicht die \0. Darfst also keine Stringfunktionen mit dem buf
> aufrufen.

printf mit %s ist auch eine Stringfunktion.

Autor: Nop (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter II schrieb:
> vermutlich kannst du auch einfach so den String übergeben
> spi_flash_write(0x8c000, (uint32_t*)buf, 4));

Nein, das geht nicht besonders gut, weil buf als array of char zwar 
genauso 4 Bytes belegt wie ein uint32_t, aber buf ist ohne Alignment. 
Wenn die Routine einen uint32_t erwartet, wird sie wohl auch ein 
korrektes alignment erwarten.

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.