Forum: Mikrocontroller und Digitale Elektronik Speicherbereich in String abspeichern


von Ronny (Gast)


Angehängte Dateien:

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.
1
char temp_string[];
2
int i;
3
4
addr = (char *) 0x00010000; 
5
6
for(i=0; i<256 ; i++)
7
{
8
    temp_string[i] = *(addr+i);  
9
}

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

von Timmo H. (masterfx)


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.

von Ronny (Gast)


Lesenswert?

Da hast du natürlich Recht, dass ist schlampig!

Aber
1
char temp_string[512];
bringt keine Besserung!

von Matthias L. (Gast)


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

von Ronny (Gast)


Lesenswert?

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

von Matthias L. (Gast)


Lesenswert?

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

von Timmo H. (masterfx)


Lesenswert?

1
char temp_string[512];
2
char *addr;
3
int i;
4
5
addr = (char *) 0x00010000; 
6
7
for(i=0; i<256 ; i++)
8
{
9
    temp_string[i] = *(addr+i);  
10
}
So sollte es meines Erachtens gehen.

von Ronny (Gast)


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.

von Matthias L. (Gast)


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!

von holger (Gast)


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.

von Ronny (Gast)


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?

von holger (Gast)


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.

von Matthias L. (Gast)


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.

von Ronny (Gast)


Lesenswert?

Halt, Moment, du sprichst jetzt wieder sicher von der Ausgabe?! Die 
funktioniert!

Das hier:
1
char temp_string[512];
2
char *addr;
3
int i;
4
5
addr = (char *) 0x00010000; 
6
7
for(i=0; i<256 ; i++)
8
{
9
    temp_string[i] = *(addr+i);  
10
}
erzeugt in der Ausgabe 0,225
und nicht wie ich es eigentlich will 0,225 0,475 0,000....

Wenn ich aber jetzt:
1
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)

von holger (Gast)


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;

von Matthias L. (Gast)


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!

von Severino R. (severino)


Lesenswert?

Ronny wrote:
> Wenn ich aber jetzt:
>
1
> char temp_string[512] = "0,225 0,475 0,000";
2
>
> 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)

von Ronny (Gast)


Lesenswert?

Oh man, das ist ja peinlich...

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

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.