PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : c++ + String + Integer Problem



Magge2k
09.04.2006, 15:45
Hi Leute,

wie kann ich eine Reihe von Hex-Werten in einen String packen?

also der String soll USBDATA heißen und die folgende werte sollen da rein

0x02,0x33,Wert1,Wert2,Wert3,Wert4,Wert5,Wert6,Wert 7,Wert8,0x0D


Ich hoffe des war deutlich ausgedrückt!

greez!

askazo
09.04.2006, 17:41
Da hätte ich eine fertige Funktion für Dich, allerdings müsstest Du bis morgen warten, die habe ich nur auf meinem Arbeits-PC...

askazo

09.04.2006, 17:45
Joa das wäre cool!

askazo
10.04.2006, 07:16
So, folgende Funktion macht aus einem Hex-Byte ein Ascii-Word.
Aus 0x2F wird also 0x3246. Wenn Du das Word nun in einen String schreibst, wird wieder 2F draus, diesmal als String.
Nun musst Du das ganze nur noch zu einem kompletten String zusammensetzen.
Das 0x lässt sich dann auch leicht einbauen, wenn Du das noch davor haben möchtest.


WORD Hex2Ascii(BYTE byHex)
{
WORD wAscii;
BYTE byLow, byHigh;

byLow = byHex & 0x0F;
byHigh = byHex >> 4;

if (byHigh > 9)
wAscii = (0x37 + byHigh) << 8;
else
wAscii = (0x30 + byHigh) << 8;

if (byLow > 9)
wAscii += 0x37 + byLow;
else
wAscii += 0x30 + byLow;

return wAscii;
}

Gruß,
askazo

Magge2k
13.04.2006, 20:44
aha Danke!

Nur hab ich gerade ein kleines Verständnissproblem.
Weil ich weiß nicht so genau wie ein String aufgebaut ist.

Wenn ich deine Funktion nun benutze dann wäre es mir mit dieser Möglich einen HEX-Wert z.B. 0x2F auf einem LCD-Display auch als 2F auszugeben.

Aber ich möchte ja Daten über den USB-Bus zu meinem µController bringen. Dazu muss ich diese Daten (siehe ersten Beitrag) in einen String schreiben z.B. *string um möglichst "viele" Daten auf einmal zum µC zu bringen. Am µC sollen dann wieder normal die Daten vorhanden sein.

z.B.

0x02,0x33,0xFF,Wert2.....usw.,0x0D

und dann bekommt der µController auch wieder

STX = 0x02
DEVICE = 0x33
Wert1 = 0xFF
Wert2 = 0x00
... usw.

ETX = 0x0D

Sorry wenns schlecht beschreiben ist ich hab keine ahnung wie ich mich so recht ausdrücken soll.

gruß


PS: Weil bei einem String kann ich ja im normalfall einfach "HalloWelt!" schreiben und dann kommen die Werte nacheinander anstelle von dem "" und den Buchstaben was ja ASCII werte sind möchte ich halt normale HEX-Werte von 0 - FF verschicken...

lion1984
13.04.2006, 20:52
Hallo,

such mal die libary string. da gibt es eine funktion die nennt sich strcat. mit der kannst du problemlos an einem string einen weiteren anhängen, würde dann so aussehen:



char USBDATA[100]
strcpy(USBDATA,"02"); //oder 0x02, jenachdem was du brauchst/willst
strcat(USBDATA,"33"); //hier das selbe
strcat(USBDATA,Wert1); // anhängen
strcat(USBDATA,Wert2); // anhängen
strcat(USBDATA,Wert3); // anhängen
strcat(USBDATA,Wert4); // anhängen
strcat(USBDATA,Wert5); // anhängen
strcat(USBDATA,Wert6); // anhängen
strcat(USBDATA,Wert7); // anhängen
strcat(USBDATA,Wert8); // anhängen
strcat(USBDATA,"0D"); // anhängen


das einzige was du beachten musst, ist even. das format deiner werte, sollte es probleme geben sollte aber jede hilfe klären :)

mfg Lion

Magge2k
13.04.2006, 22:02
Ja gut nur möchte ich ja keinen String an einen String hängen sondern aus vielen char einen String bilden.

lion1984
13.04.2006, 22:05
Hallo,

was ist ein string und ein char? hm hm ? da gibt es kaum unterschiede bis auf das, dass der string begrenzt ist, zb (char test[10]), sonst ist da kein unterschied. und ausserdem ist es nicht besser wenn du für werte fixen bereicht nimmst? 2, 3 od 4 stellen? somit is egal welchen wert du hast, du hast immer deine fixe "wortbreite", wenn man es so nennen will.

mfg Lion

Magge2k
13.04.2006, 22:17
?!?

Ich blick jetzt grad gar nix mehr.....

wenn ich z.B. einen *String = "Hallo" habe

Dann besteht der string doch aus Folgendem:

H = 0x48
a = 0x61
l = 0x6C
l = 0x6C
o = 0x6F

also stehen diese Werte doch irgendwie hintereinander?!?

Nur muss ich die Hex-Werte ja gar nicht hinschreiben weil mein Compiler ja weiß das ein H, 0x48 entspricht. wenn ich das Wort zwischen die Anführungszeichen schreibe.

Bei deiner Funktion da oben steht aber mein HEX-Wert den ich haben möchte zwischen den "" dies müssten dann aber zwei Werte sein zum einen 0x30 und zum anderen 0x44?!? oder sehe ich des falsch?

Sorry ich verstehe aber gerade die Welt nicht mehr.

Ich dachte irgendwie an so etwas:

sprintf(output,"%c%c%c%c%c%c%c%c%c%c%c",0x02,DEVICE,WERT0,WERT1,WERT2,WERT3,WERT4,WERT5,W ERT6,WERT7,0x0D);

nur funktioniert des ganze nicht... :-s

Magge2k
13.04.2006, 22:46
OK schwere Geburt!!!

Aber jetzt endlich hab ich es doch noch geschafft!




char output[14];

output[0] = 0x02;//STX
output[1] = 0x33;//DEVICE
output[2] = 0x48;//WERT0
output[3] = 0x65;//WERT1
output[4] = 0x79;//WERT2
output[5] = 0x20;//WERT3
output[6] = 0x48;//WERT4
output[7] = 0x6F;//WERT5
output[8] = 0x21;//WERT6
output[9] = 0x21;//WERT7
output[10]= 0x0D;//ETX

cout << output << endl;



Trotzdem danke an euch alle!

gruß Marc

lion1984
13.04.2006, 22:47
Hiho,

du kannst dir reingeben was du willst, egal ob jetzt hex wert, wie du sagt, der compiler weiß sowieso was es ist, wie du es rüberschickst kannst du bestimmen, eben durch printf, der unterschied ist, das du bei printf die formatierung angeben kannst. dazu müßtest du dir aber die hilfe genauer lesen, ich weiß zb das "%h" Hex ist und "%I" für integer.

aber ich dachte du willst nur eine variable wo alles drinsteht? ob du es mit printf(oder sprintf) oder mit anhängen machst, ist, glaubei ch mal :) egal.

mfg Lion

[EDIT] ok, ich hab irgendwie überlesen dass es nur ein HEX WERT ist, dachte das zb Wert1 mehrere zeichen hat, zb Wert1 = lalelu :)