mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Alex W. (de1m)


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);

von Peter II (Gast)


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.

von Alex W. (de1m)


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?

von Peter II (Gast)


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));

von Alex W. (de1m)


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?

von Alex W. (de1m)


Bewertung
0 lesenswert
nicht lesenswert

von Peter II (Gast)


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)

von Peter II (Gast)


Bewertung
0 lesenswert
nicht lesenswert

von Alex W. (de1m)


Bewertung
0 lesenswert
nicht lesenswert

von Peter II (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Alex W. schrieb:
> ah ja, hier aber
> 
https://espressif.com/sites/default/files/documentation/2c-esp8266_non_os_sdk_api_reference_en.pdf

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));

von Alex W. (de1m)


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

von Dirk B. (dirkb2)


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.

von Nop (Gast)


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.