C#: Hex-Wert (0x80) als Char bzw. String senden

OP #3106377
Lesenswert?

Habe hier fertige C# Funktionen die Befehle per RS232 senden. Das 
Protokoll basiert bisher komplett auf ASCII Zeichen. Jetzt kommen neue 
Befehle hinzu. Die sind aber nicht mehr ASCII, sondern z.B. einfach der 
Wert 0x80.
VS2010 gibt zwar keine Fehlermeldung raus, aber per RS232 wird, egal was 
ich mache, immer nur '?', also 0x3F anstatt 0x80 gesendet. Ich nehme an 
das das Encoding Probleme macht, weil es eben kein ASCII Zeichen mehr 
ist. Ich würde ungern den Code großflächig ändern wollen.
Gibt es eine Möglichkeit dem Programm beizubringen einfach alles so zu 
senden wie es ist?


Vereinfacherter Code:
1
char cmd;
2
char[] datatx = new char[4];
3
char[] datarx = new char[4];
4

5
// Kommando 
6
cmd = (char)0x80;// 'a'; // 'a' geht, 0x80 nicht!
7
                
8
// Senden
9
SendRecCommand(cmd, ref datatx, ref datarx);

Die Unterfunktion SendRecCommand fügt das cmd Char in ein weiteres Char 
Array ein und sendet alles per COMPort.Write raus.
OP #3106614
Lesenswert?

>mach doch einfach 0x62 anstelle von 0x80
Liegt nicht in meiner Hand. Ist eine Vorgabe.

>weißt du überhaupt was die Funktion machen soll
Ja, die packt das Char vom Kommando in ein Char Array und senden das 
Array mit COMPort.Write raus. Wie oben ja schon steht.

>vielleicht filtert die einfach einige sachen raus..
Absichtlich nicht, nein.
Gast #3106721
Lesenswert?

Das funktioniert, weil 'a' im unicode durch 0x0061 repräsentiert wird.

Du brauchst jetzt den "char" der durch 0x0080 repräsentiert wird wenn 
du bei dem Verfahren bleiben willst, das wird aber schwierig, weil das 
ein Steuerzeichen ist.

Interessant wäre, wie die methode SendRecCommand() von den 2-byte chars 
wieder auf das eine byte kommt...
OP #3106735
Lesenswert?

Das funktioniert alles mit 1-Byte Chars. Jedenfalls ist mir nichts 
anderes bekannt.

Vereinfacherter Code von SendRecCommand:
1
char[] DataTX = new char[25];
2

3
// Zusammenbauen
4
DataTX[0] = '#';     // Startzeichen 
5
DataTX[1] = cmd;     // Kommando
6
// Daten hinzufügen
7
for (i = 0; i < tx_cnt; i++) DataTX[2 + i] = data_tx[i];
8

9

10
// Anfrage senden
11
COMPort.Write(DataTX, 0, tx_cnt + 2);
#3106840
Lesenswert?

Beitrag "VB2005 - SerialPort1 einlesen"
COMPort.Encoding = Encoding.GetEncoding(28591) (iso-8859-1)

http://msdn.microsoft.com/de-de/library/1050fs1h%28v=vs.80%29.aspx
"Standardmäßig verwendet SerialPortASCIIEncoding zum Codieren der 
Zeichen. ASCIIEncoding codiert alle Zeichen, die größer als 127 sind, z. 
B. (char)63 oder '? '. Um zusätzliche Zeichen in diesem Bereich zu 
unterstützen, legen Sie Encoding auf UTF8Encoding, auf UTF32Encoding 
oder auf UnicodeEncoding fest."
Persönliche Seite #3107309
Lesenswert?

Arc Net schrieb:
> ASCIIEncoding codiert alle Zeichen, die größer als 127 sind, z.
> B. (char)63 oder '? '.

Das ist ja eine grauenhaft schlechte Übersetzung, völlig 
sinnentstellend.

Im Original steht

> ASCIIEncoding encodes all characters
> greater then 127 as (char)63 or '?'.

was allerdings einen Schreibfehler enthält (statt "then" sollte dort 
"than" stehen).

Korrekt übersetzt sollte das also heißen:

> ASCIIEncoding codiert alle Zeichen, die größer als 127 sind
> als (char)63 bzw. '?'.

Man sollte sich angewöhnen, bei den MSDN-Seiten nur das englische 
Original anzusehen, denn die automatische Übersetzung ist offensichtlich 
nichts wert.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren