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
charcmd;
2
char[]datatx=newchar[4];
3
char[]datarx=newchar[4];
4
5
// Kommando
6
cmd=(char)0x80;// 'a'; // 'a' geht, 0x80 nicht!
7
8
// Senden
9
SendRecCommand(cmd,refdatatx,refdatarx);
Die Unterfunktion SendRecCommand fügt das cmd Char in ein weiteres Char
Array ein und sendet alles per COMPort.Write raus.
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.
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.
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.
nachtrag:
SendRecCommand()
weißt du überhaupt was die Funktion machen soll
(wir wissen das nämlich nicht)
vielleicht filtert die einfach einige sachen raus..
>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.
>>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 ...
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...
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...
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( )
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."
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.