Forum: Mikrocontroller und Digitale Elektronik Maximale Stringlänge in C


von David G. (Gast)


Lesenswert?

Hallo,
was ist bei gcc für µc die maximale Stringlänge z.B für eine Serielle 
Übertragung?

von Karl H. (kbuchegg)


Lesenswert?

So groß, wie du das Array dimensionieren kannst, in dem die Character 
gespeichert werden.

Normalerweise also der Wertebereich eines size_t. Auf einem AVR ist 
allerdings aus praktischen Gründen, meist die Größe des Speichers das 
Limit.

von Mike (Gast)


Lesenswert?

David G. schrieb:
> die maximale Stringlänge z.B für eine Serielle Übertragung?

Die serielle Übertragung ist nicht an irgendwelche Stringlängen 
gebunden. Jedes Zeichen wird einzeln über die Schnittstelle übertragen 
und löst bei Bedarf z.B. einen Interrupt aus. Wie das Programm mit dem 
Zeichen umgeht, ist einzig und alleine seine Sache. Es kann die Zeichen 
einfach einzeln im WOM ablegen und braucht dann überhaupt keine Strings.

Und in den WOM paßt mehr rein, als man so einem kleinen µC zutraut ;-)

von David G. (Gast)


Lesenswert?

ah, ok, sowas hatte ich jetzt schon gelesen.
In Pascal wird einem das vom Compiler abgenommen, und ers tneuere 
Versionen können bis 2Gb, bei den alten ist bei 255 zeichen Schluß weil 
ShortString..
Also müßte ich es genauso umständlich wie in C machen, wenn es mehr 
werden sollen :-(

von Peter II (Gast)


Lesenswert?

David G. schrieb:
> In Pascal wird einem das vom Compiler abgenommen, und ers tneuere
> Versionen können bis 2Gb, bei den alten ist bei 255 zeichen Schluß weil
> ShortString..
> Also müßte ich es genauso umständlich wie in C machen, wenn es mehr
> werden sollen :-(

dafür kann Pascal auch eine \0 im String speichern.

von David G. (Gast)


Lesenswert?

hilft mir das irgendwie?
Der gesendete String ist ja festgelegt.

von Peter II (Gast)


Lesenswert?

David G. schrieb:
> hilft mir das irgendwie?
manchmal schon, damit kann man jeden Inhalt im einen String ablegen.

> Der gesendete String ist ja festgelegt.
keine Ahnung was bei dir festgelegt ist.

von Karl H. (kbuchegg)


Lesenswert?

definiere 'umständlich'.

Die Kunst besteht ja nicht darin einen String der Länge x zu übertragen. 
Das kann man jedem Affen beibringen (keine Beleidigung beabsichtigt).
Die Kunst besteht darin, dass auch dann noch alles korrekt und 
fehlerfrei läuft, wenn die Putzfrau das Kabel der seriellen 
Schnittstelle abzieht und im laufenden Betrieb wieder ansteckt. Da 
trennt sich dann die Spreu vom Weizen. Und das kann auch dein Pascal 
nicht alleine handhaben.

von David G. (Gast)


Lesenswert?

und genau darum gehts es mir, das wenn es zu Übertragungsfehlern komt, 
nicht alles plözlich verschoben ist..hmm..nun gut

von David G. (Gast)


Lesenswert?

Wie geht man da am bestne vor?
Ich habe jetzt nen Testarray aus 13 Chars.
Ich habe hier Testwerte von 1.23;4.56endx

Ich will nun als einzele Strings
1.23
4.56 haben.
end ist das ende..x eine unwichtiges Zeicehn oder ein Fehler etc pp

Einfach abzählen, ginge, sorgt aber sicher für Fehelrquellen?
Z.B. bei Temperaturen könnte es ja 1.50 oder aber auch 23.0 sein
Da würde es ja zum Fehler kommen

von Karl H. (kbuchegg)


Lesenswert?

David G. schrieb:
> Wie geht man da am bestne vor?

indem man erst mal ein vernünftiges Protokoll definiert, so dass man 
anhand des nächsten erhaltenen Zeichens (ja, Zeichnes) entscheiden kann, 
wie es im Empfang weiter geht.

> Ich habe jetzt nen Testarray aus 13 Chars.

Und dann definiert man die Dinge nicht 'auf Knirsch', so dass man nur 
mit Gewalt und viel Glück einem String-Überlauf gerade noch so entkommt.

> Ich habe hier Testwerte von 1.23;4.56endx

Also Zahlen.
Wenn möglich speichert man die überhaupt nicht als String, sondern 
wandelt die während des Einzelzeichen-Empfangs sofort in die Zahl um 
bzw. 'erweitert' eine Zahl um die Ziffer im nächsten erhaltenen Zeichen.

Einzige Ausnahme: wenn am anderen Ende schon auch mal ein Mensch sitzt, 
der gerne auch mal mit Backspace bereits übertragene Zeichen 
zurücknimmt. Aber dann wird das mit einem 13-er char Array sowieso 
nichts vernünftiges werden.

von Mike (Gast)


Lesenswert?

David G. schrieb:
> und genau darum gehts es mir, das wenn es zu Übertragungsfehlern komt,
> nicht alles plözlich verschoben ist..hmm..nun gut

FEC sollte dagegen helfen. Der Stecker darf allerdings nicht beliebig 
lange gezogen sein ;-)
http://de.wikipedia.org/wiki/Vorw%C3%A4rtsfehlerkorrektur

von David G. (Gast)


Lesenswert?

??
ist ; kein entsprechendens Zeichen?!?

Bei dem 13 Char handelt es sich um einen festen wert, da ist nicht auf 
Knirsch,d aich es testweise ohne Seriele übetragung gerade nachbaue...

von David G. (Gast)


Lesenswert?

Ein starchar könnt ich noch einfüge. Also z.B. S

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

David G. schrieb:
> Bei dem 13 Char handelt es sich um einen festen wert, da ist nicht auf
> Knirsch,d aich es testweise ohne Seriele übetragung gerade nachbaue...
Blöderweise ist die REalität aber so, dass wegen Störungen oder 
sonstwas auf einemal mehr oder weniger als die 13 Zeichen kommen. Oder 
andere Zeichen als die erwarteten. Und dann muss dein Parser (das wäre 
jetzt so ein Stichwort für die weitere Recherche) damit zurechtkommen 
und sich wieder aufsynchronisieren können.

David G. schrieb:
> Ein starchar könnt ich noch einfüge. Also z.B. S
Wenn du "noch was einfügen" kannst, dann hast du offenbar das Protokoll 
in der Hand. Und dann mach einfach etwas, was man z.B. auch am Terminal 
sinnvoll lesen kann.
Statt das, was David G. schrieb:
> 1.23;4.56endx
also eher sowas:
00123;00456(CR)(LF)
Auch das sind 13 Zeichen, aber jetzt hat jede Stelle immmer die selbe 
Bedeutung. Und wenn das CRLF empfangen wurde, musst du nur noch 
kontrollieren, wieviele Zeichen davor empfangen wurden und kannst sagen: 
wenn es nicht genau 12 waren, dann war da ein Fehler. Fertig.
Wenn kein Fehler war, dann ist das erste Zeichen eine Hunderterstelle, 
das zweite die Zehnerstelle, das dritte eine Einerstelle, dann kommen 
Nachkommastellen. Dann muss ein ';' kommen, sonst: Fehler! Und so 
weiter...

von David G. (Gast)


Lesenswert?

das lässt sich aber vermutlich nicht, oder nur sehr viel Aufwand in der 
PC Software umsetzen, da ich hier mit Profilab arbeite und wahlweise der 
Empfänger ein µc oder eben der PC ist.
Controllerseitig hätte ich es sonst natürlich so oder so ähnlich gemacht

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.