Forum: PC-Programmierung C# string 8-Bit EEprom fähig machen


von Daniel B. (yzdani)


Lesenswert?

Servus,

wie kann ich eine Zahlenstring nach 2 stellen spalten?

BSP:

string = "05777"

da dieser String in den EEprom des Arduinos muss und ich nur ein Byte 
pro Speicherplatz frei haben ist der größt mögliche Wert 255.

Also möchte ich den String alle nach zwei stellen trennen.
 Z.b.

string byte1="77"
string byte2="57"
string byte3="05"

Den string dann das per UART auf den Controller senden mit der passenden 
Adresse.

Danach den String aus dem EEProm auslesen und  wieder zusammensetzen, zu 
nem int Wert Konvertieren und einem Timer übergeben


.Substring und .Remove geht nicht da der string  auch  so ausschauen 
kann:
string = "23"
Es ist zwischen 1 und  159999 alles möglich.


Danke im Voraus!

Gruss
Dani

von Karl H. (kbuchegg)


Lesenswert?

Daniel R. schrieb:

> string byte1="77"
> string byte2="57"
> string byte3="05"
>
> Den string dann das per UART auf den Controller senden mit der passenden
> Adresse.

Das wird aber so nichts. Denn wenn du mit Strings arbeitest, benötigst 
du zum speichern von 2 Charactern auch 2 Bytes. D.h. deine 055777 
benötigen dann im EEPROM 6 Bytes an Speicherplatz.

> Es ist zwischen 1 und  159999 alles möglich.

Erstens passt dann 159999 sowieso nicht in einen (2 Byte) int, d.h. du 
kannst eine derartige Zahl ohnehin nicht mehr als int rekonstruieren. 
Und zweitens erhebt sich die Frage, warum du da ausgerechnet eine Zahl 
in ihrer Form als Textrepräsentierung speichern willst, wo es doch 
naheliegend wäre die Zahl gleich in ihrer endgültigen binären Form als 
einen (4 Byte) long Wert zu speichern (oder 2 Byte int). Das würde dann 
in weiterer Folge auch die Umwandlung auf dem Arduino bei der Verwendung 
obsolet machen, da dann der EEPROM Inhalt direkt und ohne weiteres Zutun 
als Zahl benutzt werden kann.
Ganz abgesehen davon, dass du die Information, wie genau auf dem Arduino 
Dinge gespeichert werden, überhaupt nicht wissen willst. Für den PC ist 
das einfach der 3. Konfigurationseintrag, vielleicht hat der auch einen 
Namen den man sich leichter merken kann. Aber wie und wo der Arduino 
sich das speichert, das will man am PC doch gar nicht wissen. Wenn das 
ein Zahlenwert ist, dann soll der Arduino sich das so speichern können, 
wie es für ihn zweckmässig ist. Der PC übergibt per Schnittstelle
1
SET DUTY 8745;
bzw. fragt den Wert mittels
1
GET DUTY;
ab und gut ists. Der Arduino antwortet dann zb mit
1
VALUE DUTY 8745;

(anstelle von DUTY kann das natürlich auch der 3. 
Zahlen-Konfigurationsparameter sein, wenn man sich nicht mittels Namen 
binden möchte und die Schlüsselwörter müssen auch nicht 'GET', 'SET', 
'VALUE' lauten. Das sind jetzt nur Ideen. Semantisch trägt
1
S3,8745;
2
G3;
3
=3,8745;
genau die gleiche Information, ist aber leichter per Programm zu 
handhaben, weil umfangreichere String Parsing Aktionen entfallen)

> Den string dann das per UART auf den Controller senden mit der passenden 
Adresse.

Das kannst du ja nach wie vor. Dazu musst du auf dem PC keinen String 
deswegen zerlegen. Übergib den String an den Arduino, zusammen mit der 
Adresse, an der dieser zu speichern ist, im Arduino wird die Zahl in 
ihre Binärform überführt (so wie man das an Schnittstellen eben macht, 
die textbasiert sind) und als solche dann im EEPROM abgelegt. Dazu 
brauchst du nichts am PC zu zerlegen. Du bist hier gerade drauf und 
drann, Funktionalität an der falschen Stelle (=im PC) zu implementieren.

: Bearbeitet durch User
von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

System.Text.Encoding.Unicode.GetBytes(text);

Oder Ascii oder UTF8 oder ...

von Daniel B. (yzdani)


Lesenswert?

Vielen Dank für die Antworten!

Meine Lösung:

übertrage jetzt den kompletten String mit dem 
Myserialport.writeline(mystring)

dort füge ich den string mit der Funktion Serial.parseInt() den string 
zusammen und schreibe ihn mit der AVR/EEPROM.h libary in den EEPROM

wie ich das gemacht habe seht ihr hier:
Beitrag "Arduino EEPROM _read_block HOW TO?"

Gruß

Dani

von Karl H. (kbuchegg)


Lesenswert?

Daniel R. schrieb:
> Vielen Dank für die Antworten!
>
> Meine Lösung:
>
> übertrage jetzt den kompletten String mit dem
> Myserialport.writeline(mystring)
>
> dort füge ich den string mit der Funktion Serial.parseInt() den string
> zusammen und schreibe ihn mit der AVR/EEPROM.h libary in den EEPROM
>
> wie ich das gemacht habe seht ihr hier:
> Beitrag "Arduino EEPROM _read_block HOW TO?"

Na ja. Das ist ja noch nicht alles.

Jetzt gehts ja erst richtig los mit dem Protokoll.
Ausserdem solltest du mal mit deiner 'Kundschaft' darüber reden, wie die 
darüber denken, dass du mit parseInt den Arduino während der Übertragung 
komplett lahm legst. Es gibt Anwendungen bei denen es nicht akzeptabel 
ist, dass der Rechner seine eigentliche Steueraufgabe nicht wahrnimmt, 
nur weil gerade neue Werte eingespielt werden.

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.