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


von Jörg S. (joerg-s)


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.

von Peter II (Gast)


Lesenswert?

Jörg S. schrieb:
> 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?

denn verwende keine Strings sondern byte arrays.

von Jörg S. (joerg-s)


Lesenswert?

>Ich würde ungern den Code großflächig ändern wollen

von Peter II (Gast)


Lesenswert?

Jörg S. schrieb:
> Ich würde ungern den Code großflächig ändern wollen

wo ist das Problem char und byte erstmal zu tauschen.

von Jörg S. (joerg-s)


Lesenswert?

Wenn es denn keine möglichkeit ala
cmd = (char)0x80;
gibt, mache ich das auch, wenn dem eben so wäre.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jörg S. schrieb:
> aber per RS232 wird, egal was
> ich mache, immer nur '?', also 0x3F anstatt 0x80 gesendet.

Wie diagnostizierst Du das?

von Jörg S. (joerg-s)


Lesenswert?

Terminal Programm

von Peter II (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Jörg S. schrieb:
>> aber per RS232 wird, egal was
>> ich mache, immer nur '?', also 0x3F anstatt 0x80 gesendet.
>
> Wie diagnostizierst Du das?

ist eigentlich normal, jedes zeichen >128 wird als ? dargestellt wenn 
man es vesucht in asscii zu wandeln.

von Jörg S. (joerg-s)


Lesenswert?

Macht das Terminal Programm (OC Console) nicht. Das würde in dem Fall 
Leerzeichen in der ASCII Ansicht anzeigen.
In der Hex Ansicht sieht man jedoch 0x3F, also '?'. Also wird garantiert 
kein 0x80 übertragen.

von Robert L. (lrlr)


Lesenswert?

mach doch einfach 0x62 anstelle von 0x80
(also ein kleines "b")
dann weiß ob es funktioniert..

von Robert L. (lrlr)


Lesenswert?

nachtrag:

SendRecCommand()

weißt du überhaupt was die Funktion machen soll
(wir wissen das nämlich nicht)

vielleicht filtert die einfach einige sachen raus..

von Jörg S. (joerg-s)


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.

von csharp (Gast)


Lesenswert?

Wie oben bereits erwähnt, macht man das unter C# mit Byte-arrays wenn 
"char" im sinne "byte" gemeint ist, sizeof(char) ist hier nämlich 2 
Byte.

von Robert L. (lrlr)


Lesenswert?

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

ach gott..

einfach nur zum TESTEN
ob "syntaktisch" alles OK ist ...

von Jörg S. (joerg-s)


Lesenswert?

Robert L. schrieb:
> einfach nur zum TESTEN
> ob "syntaktisch" alles OK ist ...
Wie geschrieben, es kommen nur neue Befehle hinzu, d.h. es hat bisher 
alles mit ASCII funktioniert und funktioniert auch weiterhin...

von Robert L. (lrlr)


Lesenswert?

??

mit 'a' hat es funktioniert, hast du geschrieben


du gehst davon aus, dass es mit 0x61 auch funktioniert, hast es aber NIE 
ausprobiert..

von Jörg S. (joerg-s)


Lesenswert?

Ach so meinst du das. Ja
cmd = (char)0x61;
funktioniert ('a' im Terminal)

von csharp (Gast)


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

von Robert L. (lrlr)


Lesenswert?

cmd = '\x0080';

geht das besser?

von Jörg S. (joerg-s)


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

von csharp (Gast)


Lesenswert?

Die SerialPort.Write-Methode mit Byte[], string oder char[], ihr nutzt 
letzteres.

Robert L. schrieb:
> cmd = '\x0080';
>
> geht das besser?

oder versuch mit Convert.ToChar( )

von Arc N. (arc)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Frank M. (aktenasche)


Lesenswert?

so kompliziert kann die sendefunktion ja nicht sein. in .net kann man in 
3 zeilen was aus der seriellen schnittstelle rausschicken.

von bluppdidupp (Gast)


Lesenswert?

Ich würds auch lieber von char auf byte umbauen statt zu pfuschen ;D

von Jörg S. (joerg-s)


Lesenswert?

Danke schon mal für die Hinweise, am Dienstag geht es weiter...

von Strangtinga (Gast)


Lesenswert?

Jörg S. schrieb:
> am Dienstag geht es weiter

Metallica-Fan?
The Day That Never Comes... :)

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.