Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: wie bekomme ich den string in ein Byte[] Kategorie: Programmierung (von wernerAZ - 30.03.2007 13:55)
Als Antwort auf Re: wie bekomme ich den string in ein Byte[] von André H. - 30.03.2007 9:13
Ich nutze:
C164CI-ControllerBoard, CC2-Application-Board, OSOPT V3.1
Lieber Andre',
respekt, respekt...
Deine inline funktionen haben mich sehr beeindruckt.
Wie kommt man dann an diese faszinierenden Funktionen.
Also wenn du mal ein Buch darĂĽber schreibst, kauf ich es sofort. Ehrenwort!
Deine Hilfe hat mir sehr geholfen. Danke.

...dann kann ich ja schon an die Berechnungen, bis bald.
Werner

> Hallo Werner,
>
> Du machst Dir unnötig Arbeit.
> Du brauchst hier nichts kopieren, sondern lediglich erweiterte Funktionen fĂĽr flash.c2,
> um Deinen eigenen Datentyp direkt speichern zu können:
>
> Versuche einfach folgendes:
>
> type gpsDaten
> {// Länge: 5x32Byte =160Byte
>  string breiteB;
>  string breite;
>  string laengeL;
>  string laenge;
>  string name;
> }
>
>
> inline function writegpsDaten (byte segment, int addr, gpsDaten data, int len) returns int
> {
>  inline vmcodes.VM_INLINE_SYSCALL+flash.Segment;
>  inline flash._WRBYTEARR;
> }
>
> inline function readgpsDaten (byte segment, int addr, gpsDaten data, int len)
> {
>  inline vmcodes.VM_INLINE_SYSCALL+flash.Segment;
>  inline flash._RDBYTEARR;
> }
>
> gpsDaten location[15];
>
> thread main
> {
>  //...
>  writegpsDaten(1, 0, location[0], 160);
>  writegpsDaten(1, 160, location[1], 160);
>  readgpsDaten(1, 0, location[15], 160);
>  //...
> }
>

> Als Länge mu� hier immer die Grö�e eines Arrays(=5Strings) angegeben werden.
> Hier sind das 160Byte.
>
> Wenn Du den gesamten Inhalt von location[] in den Flash schreiben willst,
> geht das auch sehr einfach, und ohne For-Schleife. ;-)
>
> type gpsDaten
> {// Länge: 5x32Byte =160Byte
>  string breiteB;
>  string breite;
>  string laengeL;
>  string laenge;
>  string name;
> }
>
>
> inline function writegpsDatenArray (byte segment, int addr, gpsDaten data[], int len) returns int
> {
>  inline vmcodes.VM_INLINE_SYSCALL+flash.Segment;
>  inline flash._WRBYTEARR;
> }
>
> inline function readgpsDatenArray (byte segment, int addr, gpsDaten data[], int len)
> {
>  inline vmcodes.VM_INLINE_SYSCALL+flash.Segment;
>  inline flash._RDBYTEARR;
> }
>
> gpsDaten location[15];
>
> thread main
> {
>  //...
>  writegpsDatenArray(1, 0, location, 160*15);
>  readgpsDatenArray(1, 0, location, 160*15);
>  //...
> }
>

> Die Grö�e besteht hier aus 160Byte der 5 Strings mal der Anzahl der location-Elemente.
>
> Wenn Du Dir die Längenangaben sparen bzw. vereinfachen willst, kannst
> Du einfach entsprechende Funktoinen zwischenschalten:
>
> function flashWrGPSDaten (byte segment, int addr, gpsDaten data) returns int
> {
>  return writegpsDaten(segment, addr, data, 160);
> }
>
> function flashRdGPSDaten (byte segment, int addr, gpsDaten data) returns int
> {
>  return readgpsDaten(segment, addr, data, 160);
> }
>
> function flashWrGPSDatenArray (byte segment, int addr, gpsDaten data[], int len) returns int
> {
>  return writegpsDatenArray(segment, addr, data, 160*len);
> }
>
> function flashRdGPSDatenArray (byte segment, int addr, gpsDaten data[], int len) returns int
> {
>  return readgpsDatenArray(segment, addr, data, 160*len);
> }
>

>
> Beachte aber beim Flash immer, da� dieser nur Segmentweise gelöscht werden kann!
> Ein Ă?berschreiben bereits vorhandener Werte ergibt eine "nette" DatenverknĂĽpfung.
> So etwas kann man an Hand der RĂĽckgabewerte der Schreibfunktionen erkennen.
> (Es wird false zurĂĽckgegeben.)
>
> MfG André H.
>
>
> > sorry, ist schon spät,
> > nicht midString, sondern strx.insert ist die Zauber-Routine.
> > Gute Nacht
> > Werner
> >
> > > Hallo nochmal,
> > > also ins Flash schreiben ging gut. Mit dem Auslesen war es schwieriger. Die Ausgabe auf mein Tochlcd funktionierte gleich,
> > > aber um die Daten  auf das lcdext zu bekommen und um die Daten weiter zu bearbeiten,
> > > muĂ?ten die byteBuf[]-Daten wieder in ein String umgewandelt werden.
> > > Mit flash.readStringArray bekam ich auch die abgespeicherten Werte ab einer bestimmten Position
> > > aufs extLCD, aber ich konnte nicht die Länge bestimmen.
> > > Und an dem Versuch, es gleich als StringArray abzuspeichern, bin ich kläglich gescheitert.
> > > Falls das jemand geschaft hat, täte mich ein kleines Beispiel interessieren.
> > >
> > > Wie dem auch sei, mit der Zauber-Routine von midString gelang es mir dann byte buf[] in String umzuwandeln.
> > > Falls jemand eine konventionelle Lösung hat...Bin ich daran interessiert.
> > >
> > >
> > > //Flash lesen
> > > zeile=0;
> > > lcdext.clear();
> > > touchlcd.clear();
> > > for k=1 ... 10
> > >     {
> > >     str.clear(s);
> > >     flash.readByteArray(1,k*64,buf,64);
> > >     //mem.copy(s,0,buf[35],20); //funktioniert leider nicht
> > >     strx.insert(buf[35],s,0,20);//geht doch, byte[] in string
> > >     lcdext.delline(1);
> > >     lcdext.line(1);
> > >     lcdext.print(s);
> > >     lcdext.delline(2);
> > >     lcdext.line(2);
> > >     lcdext.zahl3(str.length(s));
> > >     touchlcd.text('L',0,zeile,buf[35],20);
> > >     zeile=zeile+6;
> > >     sleep 3000;
> > >     }
> > >

> > > mfg
> > > Werner
> > >
> > > > Hey Martin,
> > > > dann klon ich eben �pfel und Birnen. Ich möchte Datensätze die grö�er sind als 30 Byte abspeichern.
> > > > Aber dank eines Beitrages vom April 2003 in diesem Forum über mem.copy, habe ich die Lösung gefunden.
> > > > Bin gerade am ausprobieren.Sieht aber gut aus. Anbei der Zaubercode!
> > > >
> > > > //irgendwo am Anfang
> > > > byte buf[64];
> > > >
> > > > //Flash beschreiben
> > > > for k=2 ... 11
> > > >     {
> > > >     mem.fill(buf,64,32);
> > > >     mem.copy(buf,0,location[k].breiteB,1);
> > > >     mem.copy(buf,1,location[k].breite,11);
> > > >     mem.copy(buf,12,location[k].laengeL,1);
> > > >     mem.copy(buf,13,location[k].laenge,12);
> > > >     mem.copy(buf,25,location[k].datum,10);
> > > >     l=str.length(location[k].name);
> > > >     mem.copy(buf,35,location[k].name,l);
> > > >     lcdext.line(1);
> > > >     lcdext.zahl(flash.writeByteArray(1,k*64,buf,64));
> > > >     }
> > > > lcdext.line(2);
> > > > lcdext.print("Erledigt");
> > > >

> > > > Aber trotzdem vielen Dank fĂĽr deine Antwort.
> > > >
> > > > Ein glĂĽcklicher Werner.
> > > >
> > > > > Hallo Werner
> > > > >
> > > > > Du versuchst gerade Ă?pfel auf Birnen zu Klonen ;)
> > > > > ein String benötigt unabhängig von seiner Länge immer 32 Byte!
> > > > > Strings kannst du mit der Funktion Flash.writeString() direkt in den Flash schreiben,
> > > > > dabei musst du beachten daĂ? du mit 32 er Schritten Addressierst.
> > > > > Siehe Modulhilfe Flash.HTML.
> > > > >
> > > > > GruĂ? Martin
> > > > >
> > > > >
> > > > > > Hallo zusammen,
> > > > > > ich möchte mehrere Strings in ein byte[] Array schreiben, um es dann in den Flash-Speicher zu speichern.
> > > > > > Hier meine definition:
> > > > > >
> > > > > > type gpsDaten
> > > > > > {
> > > > > > string breiteB;
> > > > > > string breite;
> > > > > > string laengeL;
> > > > > > string laenge;
> > > > > > string name;
> > > > > > }
> > > > > >
> > > > > > gpsDaten location[15];
> > > > > >
> > > > > > byte buf[64]={location[x].breiteB,location[x].breite,location[x].laengeL,location[x].laenge,location[x].name};
> > > > > >
> > > > > > Aber irgendwie gelingt mir das nicht. Was mache ich verkehrt? Wie bekomme ich die Daten in buf?
> > > > > >
> > > > > > mfg
> > > > > > Werner
> > > > > >
> > > > > >
> > > > > >


    Antwort schreiben


Antworten:

Re: wie bekomme ich den string in ein Byte[] (von AndrĂ© H. - 9.04.2007 19:19)