Forum: PC-Programmierung '\0' übertragen


von Owen S. (senmeis)


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
1
char[] = "hallo\0";

MfG
Senmeis

von Peter (Gast)


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.

von Karl H. (kbuchegg)


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.

von Barny (Gast)


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%28VS.85%29.aspx
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%28v=VS.85%29.aspx

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.

von ... (Gast)


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.

von Gerry E. (micky01)


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.

von ... (Gast)


Lesenswert?

Gerry E. schrieb:
> In einem Null-terminierten String kann man beliebig viele Nullen
> unterbringen.
>
Interpretationsfrage :)
1
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.

von Rolf Magnus (Gast)


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).

von Hc Z. (mizch)


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.

von Gerry E. (micky01)


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.

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.