www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Speicherbereich in String abspeichern


Autor: Ronny (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich versuche gerade erfolglos den Inhalt eines Speicherbereichs (siehe 
Anhang) in einem String abzuspeichern. Der String sollte eigentlich so 
aussehen ("0,225 0,475 0,000 ....... "). Leider bekomme ich lediglich 
die erste Kommazahl.
char temp_string[];
int i;

addr = (char *) 0x00010000; 

for(i=0; i<256 ; i++)
{
    temp_string[i] = *(addr+i);  
}

Sprich, nach diesem Code habe ich nur "0,225" im temp_string.

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char temp_string[];
Das ist nicht gerade viel platz für ein String. Denke mal darüber nach 
eine Länge für das Char-Array zu deklarieren.

Autor: Ronny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hast du natürlich Recht, dass ist schlampig!

Aber
char temp_string[512];
bringt keine Besserung!

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>addr = (char *) 0x00010000;
>for(i=0; i<256 ; i++)
>{
>    temp_string[i] = *(addr+i);
>}

Abgesehen davon, dass man diese Schleife besser anders gestaltet, hast 
du hier folgendes Problem:

mit *(addr+i) holst du eine (hex)Zahl zwischen 0..255.
Das was du willst,:
>"0,225 0,475 0,000 ....... "
ist aber ein String. Also musst du die Zahl, die du gerade geholt hast 
(0..255) in einen String '0'..'255' wandeln.
Dazu brauchst du, mit dem Komma, den vierfachen Platz.

itoa (oder sowas) ist dein Freund
, falls du es, wie im Bildanhang, als Hex haben willst, wirds relativ 
einfach

Autor: Ronny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mmh, an meiner Ausgabe ist jedenfalls kein Fehler.
Hiermit:
char temp_string[512] = "0,225 0,475 0,000";
bekomme ich den String "0,225 0,475 0,000" korrekt ausgegeben.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sollte ne HEX-Ausgabe erzeugen...
char      sData[1024];
uint8_t   u8Cnt  = 0;
uint16_t  u16Idx = 0;
uint8_t   au8Nbr[]  = { '0','1','2','3','4','5','6','7',
                        '8','9','A','B','C','D','E','F' };
uint8_t*  addr = (char *) 0x00010000; 
...
do
{
  sData[u16Idx++] = au8Nbr[ (*addr&0xF0)>>4 ];
  sData[u16Idx++] = au8Nbr[  *addr&0x0F     ];
  sData[u16Idx++] = ' ';
}
while (    ( ++u8Cnt  != 0             )
        && ( u16Idx   <  sizeof(sData) )  );

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
char temp_string[512];
char *addr;
int i;

addr = (char *) 0x00010000; 

for(i=0; i<256 ; i++)
{
    temp_string[i] = *(addr+i);  
}
So sollte es meines Erachtens gehen.

Autor: Ronny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Matthias,

ich glaube du hast mich nicht richtig verstanden:

Ich will gar keine hexadezimale Ausgabe! Ich will einfach nur diesen 
Speicherbereich als String interpretiert ausgeben.
Es funktioniert ja auch (so ein bisschen)

Die erste Zahl (0,225) wird richtig ausgegeben. Danach reist der String 
ab und ich habe keine Ahnung warum! Eigentlich sollte die for-Schleife 
den String-Array weiter mit Werten füllen.

Timmo hat mich wohl verstanden.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>als String interpretiert ausgeben

Das ist ja was ganz anderes und hat absolut nichts mit deinem Anhang 
zutun. Das ist dann nämlich irreführend.


>Danach reist der String ab und ich habe keine Ahnung warum!

Aber ich: Wenn du einen beliebigen Speicherbereich als String 
interpretierst , dann endet der, sobald ein 0x00 "gefunden" wird, egal 
wielang dein Speicherbereich ist!

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Die erste Zahl (0,225) wird richtig ausgegeben. Danach reist der String
>ab und ich habe keine Ahnung warum!

Weil im Speicher Nullen vorkommen. Bei der ersten
Null ist der String beendet.

Autor: Ronny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Matthias,

aber ich hatte doch geschrieben:

den Inhalt eines Speicherbereichs (siehe
Anhang)

Das Bild spiegelt also den Speicherbereich in meinem Chip wieder. Es 
soll nicht die erwünschte Ausgabe sein. Sorry wenn das missverständlich 
war.


Hallo Holger,

kann ich ein weiteres Füllen des temp_string Arrays irgendwie erzwingen?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hallo Holger,
>
>kann ich ein weiteres Füllen des temp_string Arrays irgendwie erzwingen?

Du füllst den String schon korrekt. Dort wo eine 0x00 auftaucht
musst du durch 0x20 oder ' ' ersetzten.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>kann ich ein weiteres Füllen des temp_string Arrays irgendwie erzwingen?

Nicht nötig, da du ja alle 256Speicherzellen kopiert hast, aber der 
String ist nunmal zuende!

Du könntest höchstens per if einen Punkt oä ablegen, falls das Zeichen 
nicht druckbar ist.

Autor: Ronny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Halt, Moment, du sprichst jetzt wieder sicher von der Ausgabe?! Die 
funktioniert!

Das hier:
char temp_string[512];
char *addr;
int i;

addr = (char *) 0x00010000; 

for(i=0; i<256 ; i++)
{
    temp_string[i] = *(addr+i);  
}
erzeugt in der Ausgabe 0,225
und nicht wie ich es eigentlich will 0,225 0,475 0,000....

Wenn ich aber jetzt:
char temp_string[512] = "0,225 0,475 0,000";
meinen temp_string auf diese Weise fülle, bekomme ich in der Ausgabe
0,225 0,475 0,000 (das, was ich will)

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Du füllst den String schon korrekt. Dort wo eine 0x00 auftaucht
>musst du durch 0x20 oder ' ' ersetzten.

Soll natürlich ersetzen heissen :(

Hatte ich noch vergessen:
Am Ende des Strings MUSS eine Null stehen.
Also Array z.B. auf 513 Elemente und das letzte
per Hand auf 0 setzen. temp_string[512] = 0;

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>erzeugt in der Ausgabe 0,225
>und nicht wie ich es eigentlich will 0,225 0,475 0,000....

Wenn das im Speicher steht: (in hex)
30 2C 32 32 35 00 ...

Dann ist die Ausgabe aber korrekt, wovon ich ausgehe.

>char temp_string[512] = "0,225 0,475 0,000";
Erzeugt im SPeicher:
30 2C 32 32 35 20 30 2C 34 37 35 20 30 2C 30 30 30 00 ...

die ... bedeuten, dass der folgende Inhalt belanglos ist!

Vergleiche mit ner ASCII Tabelle!

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ronny wrote:
> Wenn ich aber jetzt:
>
> char temp_string[512] = "0,225 0,475 0,000";
> 
> meinen temp_string auf diese Weise fülle, bekomme ich in der Ausgabe
> 0,225 0,475 0,000 (das, was ich will)

Ja, aber hier hast Du nach dem "225" ein Blank, ASCII 0x20.
In Deinem Buffer steht aber danach (also an Adresse 0x10005) ein 0x00, 
also eben ein String-Terminator.
Den musst Du durch ein 0x20 ersetzen, z.B. so:
(*(addr+i))== 0x00 ? 0x20 : *(addr+i)

Autor: Ronny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh man, das ist ja peinlich...

Vielen Dank für eure Geduld. Ich werde euch alle heute Abend in meinem 
Gutenachtgebet erwähnen!

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.