Forum: Mikrocontroller und Digitale Elektronik const String mit parity bit


von stringcreater (Gast)


Lesenswert?

Hallo,

ich habe z.B. folgenden String, den ich in einer Header datei definiere:
const unsigned char sting = "text\r".

diesen möchte ich jedoch gleich so eingeben, dass das oberste Bit ein 
parity even Bit der unteren 7 Bits ist. Ich möchte also als letztes 
Zeichen nicht '\r' (0x0D) eingeben, sondern ein Zeichen, was den hex 
Wert 0x8D hat, eingeben.
Gibt es da eine Möglichkeit? das Zeichen 0x8D liegt ja nicht so ohne 
weiteres auf der Tastatur ;-)

Vielen Dank
Martin

von stringcreater (Gast)


Lesenswert?

oh, ich sehe gerade, dass ich den string nicht als const unsigned char 
hier habe, sondern als define:
#define STRINGNAME "text\r"

mein problem bleibt aber das gleiche, statt '\r' möchte ich ein 0x8D da 
drin stehen haben.

von Nami (Gast)


Lesenswert?

So sollte das gehen:

const unsigned char sting[] = {'t','e','x','t',0x0D};

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Oder so:

const unsigned char sting = "t\xe5xt\x8d".

Problematisch kann es bei dieser Schreibweise werden, wenn eine 
hexadezimale Zeichenkonstante nicht eindeutig ist, wie sie es wäre, wenn 
auf das 'e' beispielsweise ein d folgen würde:

"ed" -> (mit parity) "\xe5d"

In diesem Falle sollte besser "\xe5""d" geschrieben werden.

von stringcreater (Gast)


Lesenswert?

Vielen Dank für Deine lösung, sie klappt aber bei dem #define fall 
leider nicht.

ich habe aber gerade erfahren, dass es ein hex escape zeichen gibt, was 
genau das tut, was ich will:
#define STRINGNAME "text\x8D"

Schönen Tag noch

von stringcreater (Gast)


Lesenswert?

@rufus
danke auch Dir, da hast Du 'nen punkt angesprochen, den ich glatt 
übersehen hätte.

ist denn "te""xt" immer das gleiche wie "text" ? der compiler hat mir 
schon mal keine probleme rausgeschmissen, aber testern kann ich es 
gerade mangels hardware nicht ausgiebig.

von Peter D. (peda)


Lesenswert?

Und Du bist sicher, daß Du die Daten keinesfalls über die UART senden 
willst ?

Parität kann die UART beim AVR automatisch machen.
Spart also weder Zeit noch Code, wenn man das selber macht.


Peter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

stringcreater wrote:

> ist denn "te""xt" immer das gleiche wie "text"?

Zumindest auf jedem C-Compiler, der zu ANSI C89/ISO C90 und höher
kompatibel ist.

von stringcreater (Gast)


Lesenswert?

@peda,

ich bin sicher, DASS ich die daten über UART senden will, habe aber das 
problem, dass ich uart auf 8bit no parity stellen muß und nicht auf 7 
bit, parity even stellen kann. (muß auch bytes, die über UART mit 
falscher parität ankommen, ebenfalls mit falscher parität über UART 
weiterleiten und einiges mehr...)

@Jörg
das sollte der WinAVR wohl hinbekommen, vor allem mit der compileroption 
-std=c99

Vielen Dank euch allen

von Peter D. (peda)


Lesenswert?

1
#define P(x)    x^(((x<<1)^(x<<2)^(x<<3)^(x<<4)^(x<<5)^(x<<6))&0x80)
2
3
char s[] = {P('H'), P('a'), P('l'), P('l'), P('o'), 0};


Peter

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.