Brauche dringend hilfe bei einer einfachen Sache (char)



  • Hallo,

    Ich hab folgendes aus dem VB6 Code umzusetzen:
    a$ = Chr(&H82)

    und wenn ich das im C# mache
    a = ((char)(0x82)).ToString()

    bekomme ich ein ganz anderes Zeichen raus.

    a wird noch aus mehreren Chars später zusammengesetzt und an ein Gerät geschickt. Ist wichtig das es auch dem richtigen Char entspricht.

    Das VB6 Charzeichen = "," und der von C# = "?"

    Das hat bestimmt was mit der unicode Zeichencodierung zu tun oder?

    Ich probiere jetzt mal noch ein Chararray zusammenzubauen und das dann zu schicken.



  • Warum nimmst du nicht einfach:

    char c = ','; // ist dann aber nicht 0x82 sondern 0x2c
    

    Oder brauchst du den Wert 0x82? Dann würde ich dafür byte nehmen, da char eventuell mehr als ein Byte groß sein kann, da es einen Unicode-Zeichen darstellt:

    byte b = 0x82;
    


  • Die Umsetzung nach C# stimmt schon.
    Es ist einfach eine Frage, mit welchem Zeichensatz (Font) du den String dir anzeigen läßt, denn dieses Zeichen ist bei einigen Fonts wie z.B. Arial und Microsoft Sans Serif nicht definiert (und du siehst dann stattdessen das Default-Zeichen, z.B. '?').



  • O.o schrieb:

    Warum nimmst du nicht einfach:

    char c = ','; // ist dann aber nicht 0x82 sondern 0x2c
    

    Oder brauchst du den Wert 0x82? Dann würde ich dafür byte nehmen, da char eventuell mehr als ein Byte groß sein kann, da es einen Unicode-Zeichen darstellt:

    byte b = 0x82;
    

    Danke für die Antwort.... hänge da jetzt schon einige Stunden dran.

    Also wenn ich jetzt mit serialPort1.Write("," + string) schicke erkennt das Gerät auch um was es sich handelt. Hab auch schon probiert mit .Write((char)(0x2c) + string)

    Ist doch blöd wenn ich jetzt statt 0x82 "," verwenden muss. In dem VB6 Code sind noch mehrere solche stellen zu übersetzen und dann müsste ich jedesmal schaun was dem Charzeichen entspricht.

    Das problem ist einfach nur das C# Char in den Unicode umgesetzt wird. Am besten wäre es wenn es einfach als standart ANSII verschicken würde. Vielleicht liegt es auch nicht daran ist nur ne Vermutung. Den Seriellen port hab ich schon eine ANSII Codierung gegeben.

    Ach kein Plan. Ich probiere jetzt noch etwas mit dem Byte aus wenn das nicht geht muss ich wohl auf mein "," zurückkehren. Nicht das es dann auf verschiedenen Rechnern nicht mehr funktioniert, denn das wäre Fatal.

    Nachtrag:
    Jetzt hab ich eine ANSI zu UNICODE Tabelle gefunden.
    Zeichen: ‚ Ansinummer: 130 Unicode: 8218 Ansihex: 0x82 Unicodehex: U+201A

    Wenn ich jetzt wüßte wie ich das mit dem Unicode mache wär es schön und wenn es funktionieren würde.

    Probiert hab ich jetzt mal so: (char)('/u8218')

    Natürlich reagiert das Gerät nicht. Oh man bekomm noch die Kriese.... 😮



  • Ich bekomm es leider mit dem Unicode nicht hin.

    Mache es vorerst so "‚" aber ich glaube da bin ich nicht wirklicha auf der sicheren Seite.

    Ich weiß jetzt nicht was VB6 da macht mit dem Chr(&H82) das es dort funktioniert.

    Wie gesagt habs probiert als Byte zu schicken, geht nicht muss es als Charzeichen schicken. Wenn ich wüßte was dies dem Byte entspricht könnte ich es probieren.

    Besten dank.



  • Vergiss Unicode wenn du mit einem externen Gerät über die seriellen Schnittstelle kommunizieren möchtest.
    Sieh zu ob du da direkt Bytes reinschicken kannst.



  • Ok ich werd mein bestes probieren...

    Ich muss halt nur schaun was dieses chr(&h82) als byte entspricht weil c# wandelt meineswissen mit (char)(0x82) dies in diesen unicode um und dann geht nix mehr.

    Danke aber für den Hinweis...

    chr(&h82) entspricht dem ansii code 130
    und mit Byte(130) funktioniert es leider nicht 😞

    Mach ich irgendwas falsch?

    Falsche Methode bei serialPort.Write(byte)



  • O.o schrieb:

    byte b = 0x82;
    


  • Danke ich glaube ich habs...

    also hatte die ganze zeit versucht es so zu machen...

    serialport.write(new byte {130} + string)

    der string hat sich zusammengesetzt aus mehreren chars... anscheinend hat die kombination nicht ganz so funktioniert und es hat das Gerät nicht verstanden...

    jetzt hab ich testhabler mal ein Byte zusammengestellt das z.b. 130, 1, 1, 1 enthält und schon geht es...

    So ich glaub ich hab jetzt ein Anhaltspunkt, aber da mach ich morgen weiter...

    Schon blöd mit dem umsetzen aus dem VB6 code:
    das muss ich umsetzen:
    a$ = Chr(&H82) 'Uhrzeit und Datum schreiben
    a$ = a$ & Chr((Val(SekundeTxt) \ 10) * 16 + Val(SekundeTxt) Mod 10)
    a$ = a$ & Chr((Val(MinuteTxt) \ 10) * 16 + Val(MinuteTxt) Mod 10)
    a$ = a$ & Chr((Val(StundeTxt) \ 10) * 16 + Val(StundeTxt) Mod 10)

    deshalb: serialport.write(new byte {130} + string) was ja nicht ging....
    C# wandelt den char in den unicode und der ist leider größer als 130 und schon funktioniert es nicht mehr.

    Vielen Dank nochmals...



  • Wenn das Gerät ASCII erwartet könnte das so gehen.

    String str = String.Format(",{0:00}{1:00}{2:00}", 
       Convert.ToInt32(SekundeTxt), 
       Convert.ToInt32(MinuteTxt), 
       Convert.ToInt32(StundeTxt));
    
    byte[] bytes = ASCIIEncoding.ASCII.GetBytes(str);
    

    Wenns Unicode sein muss, dann vielleicht so:

    String str = String.Format("{0}{1:00}{2:00}{3:00}", 
       (char)0x82,  
       Convert.ToInt32(SekundeTxt), 
       Convert.ToInt32(MinuteTxt), 
       Convert.ToInt32(StundeTxt));
    
    byte[] bytes = ASCIIEncoding.Unicode.GetBytes(str);
    

    Wobei, wie schon andere sagten, "," entspricht 0x2C, nicht 0x82. Wenn das Gerät 0x82 erwartet geht das nicht mit ",".



  • So besten dank für eure Beiträge...

    neuer Tag neues Glück 😉

    so ich hab das jetzt so gemacht:

    databyte[0] = 0x82;
    // Zeit
    databyte[1] = (byte)((time.Second / 10) * 16 + time.Second % 10);
    databyte[2] = (byte)((time.Minute / 10) * 16 + time.Minute % 10);
    databyte[3] = (byte)((time.Hour / 10) * 16 + time.Hour % 10);
    // Datum
    databyte[4] = (byte)((date.Day / 10) * 16 + date.Day % 10);
    databyte[5] = (byte)((date.Month / 10) * 16 + date.Month % 10);
    databyte[6] = (byte)(date.DayOfWeek);
    databyte[7] = (byte)((date.Year / 10) * 16 + date.Year % 10);
    

    Man kann es bestimmt auch eleganter lösen aber so funktioniert es astrein 😉

    Also das Gerät möchte schon die 0x82 haben als Adresse. "," war nicht das Komma sondern dieses andere Unterkomma was im ANSI Code 130 ist. Unicode kann glaube ich ja nur bis 128 darüber wären es dann wieder mehr als 8 bit. Also das Gerät erwartet ANSI. Aber mit Bytes bin ich jetzt auf der 100% sicheren Seite


Anmelden zum Antworten