Forum: PC-Programmierung selsame Zeichen bei Console.Write in C# mono linux


von Roombanaut (Gast)


Lesenswert?

Hallo zusammen,

ich möchte gerne über eine einfache GUI bestimmte Befehle auf einer 
seriellen Schnittstelle ausgeben. Fernziel ist es vereinfacht auf PC1 
eine GUI zu haben die per SSH auf PC2 zugreift und dort Befehle auf der 
seriellen Schnittstelle ausgibt.

Leider habe ich mit PC-Programmierung wenig Erfahrungen. Ein paar 
Vorkenntnisse mit C# unter Windows sind vorhanden.

Um das ganze möglichst flexibel zu halten (A: USB-seriell Wandler an PC1 
/ B: Funkstrecke zu Bluetooth-Modul an Hardware / C: SSH-Tunnel zu PC2 / 
D: usw.) möchte ich gerne den ">" Befehl verwenden. Damit kann ich doch 
unabhängig von der eigentlichen GUI die Befehle vollkommen frei durch 
die Gegend schubsen oder?

Zum Einsatz kommt ausschließlich mono unter Linux.
Die GUI mit GTK# funktioniert schon mal.
Der einfachste Anwendungsfall A scheint mit
1
mono test.exe > /dev/ttyUSB0
 auch prinzipiell zu funktionieren.

Leider bekomme ich aber bei
1
  protected void OnBUpPressed (object sender, System.EventArgs e)
2
  {
3
    Console.Write((char)0x8D);
4
  }
auf der seriellen Schnittstelle immer "0xC2 0x8D".

Wo kommt denn das 0xC2 her?
Bin ich generell auf dem Holzweg?

Danke

von Peter II (Gast)


Lesenswert?

könnte etwas mit unicode zu tun habe, dann würde ich zwar eine 0x00 
erwarten - merkwürdig. Stell erstmal die passende codierung ein.

von Lukas K. (carrotindustries)


Lesenswert?

Roombanaut schrieb:
> Wo kommt denn das 0xC2 her?

0xc2 ist das startzeichen für eine UTF-8 Sequenz. Womöglich fühlt sich 
auf dem Weg bis zur tty noch wer dafür zuständig, dieses einzufügen.

von bluppdidupp (Gast)


Lesenswert?

Man könnte vermutlich auch Console.OpenStandardOutput aufrufen um den 
OutputStream zu holen und darauf direkt .WriteByte() anwenden.

von Roombanaut (Gast)


Lesenswert?

Damit muss es etwas zu tun haben denn
1
Console.Write(0x61);
 ergibt wie gewollt 0x61 (0x61 ist ja ASCII 'a').

Das 0xC2 wird also vermutlich bei allen nicht ASCII Werten 
vorangestellt.
Stellt sich die Frage wer das macht und wie man dies unterbinden kann.

von Roombanaut (Gast)


Lesenswert?

Vielen Dank.
Mit
1
  protected void OnBUpPressed (object sender, System.EventArgs e)
2
  {
3
    Stream mystream = Console.OpenStandardOutput();
4
    mystream.WriteByte(0x8D);
5
  }
funktioniert es wie gewollt.

von Arc N. (arc)


Lesenswert?

Das mag funktionieren...
Für das richtige Encoding gibt es
http://msdn.microsoft.com/en-us/library/system.console.inputencoding.aspx
und
http://msdn.microsoft.com/en-us/library/system.console.outputencoding.aspx
passend wäre z.B.:
ISO 8859-1 Latin 1; Western European (ISO)
1
// Windows-28591, ISO 8859-1
2
var enc = Encoding.GetEncoding(28591);

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.