www.mikrocontroller.net

Forum: PC-Programmierung '\0' übertragen


Autor: Owen Senmeis (senmeis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus,

Es ist bekannt, dass das Zeichen ‘\0’ am Ende einer Zeichenkette 
automatisch angehängt wird. Die Frage ist, wie kann man dieses Zeichen 
wirklich z.B. über die serielle Schnittstelle übertragen? Es geht nicht 
einfach mit
char[] = "hallo\0";

MfG
Senmeis

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du wirst uns wohl die senderoutine zeigen müssen, dann sie hört im 
normalfall auf zu senden wenn sie bei einem \0 ankommt. Die Zuweisung 
von den char* hilft uns wenig.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Lösung wird, wie schon angesprochen, in der Senderoutine liegen.
Die andere Zutat zur Lösung besteht darin, zu akzeptieren, dass man mit 
der Forderung das \0 Zeichen (welches in C ja in diesem Sinne kein 
gültiges Zeichen mehr ist) die Domäne der Strings verlässt und von 
Stringverarbeitung eine Stufe tiefer geht und einfach nur noch Bytes 
durch die Gegend schickt. Dass diese Bytes zufällig darstellbare ASCII 
Zeichen sind, ist zwar nett, darf aber nicht mehr im Sinne von Strings 
ausgenutzt werden.

Autor: Barny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich weis nicht mit welcher Programmierumgebung du programmierst.
Aber unter Visual Studio habe ich da ein nettes Struct, in dem man alle 
möglichen Einstellungen vornehmen kann.
Unter anderem gibt es auch eine Variable in diesem Struct, mit der man 
sagt, dass die 0 mitgesendet werden soll.

Schau dir einmal folgende Seite an:
http://msdn.microsoft.com/en-us/library/aa363436%2...
Wenn ich mich richtig erinnere, wird über die Variable fNull im 
verwendeten Struct das Senden und Empfangen von Binär 0 gesteuert.
http://msdn.microsoft.com/en-us/library/aa363214%2...

In deinem Fall musst du fNull = FALSE setzen.

Wenn du mit Visual Studio programmierst, solltest du _T("") anstatt "" 
bei den Strings verwenden, sonst bekommst du Probleme wenn du auf 
Unicode umstellst.

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Barny schrieb:
> Schau dir einmal folgende Seite an:
> http://msdn.microsoft.com/en-us/library/aa363436%2...
> Wenn ich mich richtig erinnere, wird über die Variable fNull im
> verwendeten Struct das Senden und Empfangen von Binär 0 gesteuert.
> http://msdn.microsoft.com/en-us/library/aa363214%2...

Falsch, das gilt nur beim Empfang, ist eine Spezialität von M$ und 
außerdem defaultmäßig sowieso ausgeschaltet.

Barny schrieb:
> Wenn du mit Visual Studio programmierst, solltest du _T("") anstatt ""
> bei den Strings verwenden, sonst bekommst du Probleme wenn du auf
> Unicode umstellst.
>

Nein, das sollte man mit Strings, die über die serielle Schnittstelle 
übertragen werden definitiv nicht tun! Sonst bekommst du erst recht 
Probleme wenn du auf Unicode umstellst.

Autor: Gerry E. (micky01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da sich Senmeis nicht mehr zu Wort meldet, hat er das schwerwiegende 
Problem wahrscheinlich gelöst.

Kleiner Schwank:

Im Grunde sollte es ausreichen, sich die Anleitung (manpage) von printf 
und seinen Abkömmlingen anzusehen. Eventuell hilft sogar ein Blick in 
das scheinbar in Vergessenheit geratene Buch der Herren Kernighan und 
Ritchie.

In einem Null-terminierten String kann man beliebig viele Nullen 
unterbringen.

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gerry E. schrieb:
> In einem Null-terminierten String kann man beliebig viele Nullen
> unterbringen.
>
Interpretationsfrage :)
char* s = "abc\0def";
Ist das jetzt 1 String oder sind es 2?

Der OP hatte aber nicht das Problem die Nullbytes irgenwie in seinen RAM 
zu bekommen, sondern sie von dort dann über seine serielle Schnittstelle 
zu übertragen.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gerry E. schrieb:
> In einem Null-terminierten String kann man beliebig viele Nullen
> unterbringen.

In einem Null-terminierten String markiert die erste Null das Ende des 
Strings. Also ist per Definition in einem Null-terminierten String immer 
exakt eine Null enthalten (die aber nicht mehr mit ausgeben wird).

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke, er spielte auf printf("das: ->%c<- hier ist ein 
NUL-Character\n", 0) an.

Nitpick: Zumindest in POSIX ist das jedoch in Zusammenhang mit printf 
nicht erlaubt, da printf nach stdout schreibt, und stdio hat die 
Beschränkungen eines Textfiles (also kein '\0' erlaubt).  Hätte er oben 
statt „man printf“ das von fprintf genommen, wär's ganz korrekt gewesen.

Autor: Gerry E. (micky01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hc Zimmerer schrieb:
> Ich denke, er spielte auf printf("das: ->%c<- hier ist ein
> NUL-Character\n", 0) an.
>
> Nitpick: Zumindest in POSIX ist das jedoch in Zusammenhang mit printf
> nicht erlaubt, da printf nach stdout schreibt, und stdio hat die
> Beschränkungen eines Textfiles (also kein '\0' erlaubt).  Hätte er oben
> statt „man printf“ das von fprintf genommen, wär's ganz korrekt gewesen.

Genau, Du hast natürlich Recht.
Ich hätte auch gleich eine Anleitung beilegen können, wie das mit der 
NULL geht.

Ich hatte ja von "printf und seinen Abkömmlingen" geschrieben.
Und wollte damit erreichen, dass der Fragensteller etwas liest.

Aber jetzt: WE.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.