Hilfe bei serieller Anbindung Brandmeldeanlage mit ESP --- Telegram mit Umlauten

Hallo, ich empfange seriell Daten einer BMA und sende diese weiter über Telegram.
Das funktioniert auch sehr gut bist Umlaute ins Spiel kommen.
Da diese als z.B. gespiegeltes Fragezeichen in der Konsole ausgefürt werden weigert sich Telegram diese zu schicken.

Kann mir jemand sagen was ich da machen kann?

leider kann ich den kompletten Code nicht einfügen, daher hier nur die wie ich vermute die entscheidende Stelle.
Da haben wir schon ein bisschen was mit replace versucht aber leider ohne Erfolg.

  if (swSer.available()) {
                                  // Serial.println(Serial1.readString());
                                  // String text = Serial.readStringUntil("\r\n");
                                 //   text = swSer.readString();
                                    text = swSer.readString();
                                    // Serial.println(text);
                                   
                  
//                                if ((strstr(text.c_str(), "Datenpunkt")) || (strstr(text.c_str(), "Brandalarm"))  != NULL)
                                      {

                                        Serial.println(text);
                                          String substring1 = "'129'";    // \u00dc  /342  \ü
                                          String substring2 = "ue";
                                          text.replace("84", "xxx");
                                          text.replace("94", "yyy");
                                          text.replace("81", "zzz");
                                          text.replace("148", "ccc");
                                          
                        
//                                           String substring1 = "1";
//                                          String substring2 = "xx";
//                                          text.replace(substring1, substring2);
                                          
                                          
                                          
                                          Serial.println(text); // string after

                                          
                                         char charBuf[text.length()+1];
                                         // text.toCharArray(charBuf,2);
                                         text.toCharArray(charBuf,text.length() +1);
                                          Serial.print("charBuf");
                                           Serial.print("---> ");
                                         Serial.println(charBuf);
                                         // msg.sender.id = 827060854 ;
                                         Serial.println("Telegramm gesendet...");
                                         myBot.sendMessage(msg.sender.id, charBuf); 
                                         myBot.sendMessage(msg.sender.id, tester); 
                                     }
                               
                               delay(100);
                        }

Das was von der BMA kommt sieht so aus mit HTherm…

-21<\r><\n>                                         System MGR          Loop Status        <\r><\n>St”rg. Ext.Alarmrg   Mgr  000       R002      SupO           21:33:26  12-M„r-21<\r><\n>                                         System MGR          A <\r><\n>St”rung Element      Mgr  000       R006      D.SupI         21:33:26  12-M„r-21<\r><\n>                                         System MGR          šE-S šberwachung   <\r><\n>St”rg. Ext.Alarmrg   Mgr  000       R001      SupO           21:33:26  12-M„r-21<\r><\n>                                         System MGR          Alarmierung 1      <\r><\n>

leider kann ich den kompletten Code nicht einfügen,

das hilft halt gar nichts, wenn du Code im verborgenen hältst. *)

lies mal den Stream aus und zeige, was in HEX ankommt, denn dein Serial Monitor kann halt nur Druckbare Zeichen anzeigen. Also entweder nimmst ein vernünftiges Terminalprogramm (Realterm, Coolterm, sscom32e,...) das Parallel in HEX darstellen kann oder du schreibst dir schnell etwas für den Arduino.

Wenn man genau weis was deine Anlage sendet kann man auch etwas empfehlen. Vieleicht ist es eh nur UTF-8.

Welche Arduino Version verwendest du?

*) Dieses Forum lebt vom Teilen von Informationen. Je bessere Angaben du machst (Brandmeldeanlage, Typ, Firmware Version, Link auf Datenblatt) - desto eher gibt es Leute die dir hierbei helfen und es entsteht Informationen die vieleicht auch mal für andere von Nutzen sind. Wenn man etwas "geschlossen" halten will, weil man etwas kommerziell verwerten will ist dieses Forum einfach der falsche Ansprechpunkt...

es ging mir nicht darum es zu verbergen, ich bin zu dumm den ganzen code einzufügen, es kam die Fehlermeldung das ich zu viele Zeichen verwende >:(

Es handelt sich um eine Zettler MZX Brandmeldeanlage. Firmware 28.6 Arduino IDE Version ist 1.8.13

Stream kommt gleich.

Hier der Stream. Ich hoffe das ist das was du sehen möchtest. Sorry mein Wissen ist in der hinsicht noch etwas beschränkt.

S53 t74  94 r72 u75 n6E g67  20 E45 n6E d64 e65  20  20  20  20  20  20  20  20 
 20 M4D g67 r72  20  20 030 030 131  20  20  20 -2D 030 030 131  20  20  20 A41 
 20  20  20  20  20  20 838 535 030 P50 H48  20  20  20  20  20  20  20  20  20 
 20 131 232 :3A 030 535 :3A 131 434  20  20 131 333 -2D M4D  84 r72 -2D 232 131 
 0D  0A  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20 
 20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20  20 
 20  20  20 T54 e65 s73 t74 m6D e65 l6C d64 e65 g67 r72 u75 p70 p70 e65  20 131 
 20  20  20 R52 a61 u75 c63 h68 m6D e65 d64 e65 r72  20 W57 e65 k6B s73 t74 a61 
t74 t74  0D  0A

Das dritte Zeichen 0x94 ist vermutlich ein kleines O-Umlaut: ‘ö’ und weiter hinten versteckt sich mit 0x84 noch ein ‘ä’:

S t   r u n g   E n d e                
  M g r     0 0 1       - 0 0 1       A
            8 5 0 P H                  
  1 2 : 0 5 : 1 4     1 3 - M   r - 2 1
0D 0A
                                   
                                       
      T e s t m e l d e g r u p p e   1
      R a u c h m e d e r   W e k s t a
t t 
0D  0A

Die TDLib-Dokumentation verlangt beim Typ string offensichtlich UTF-8:

using string = std::string
This type is used to store UTF-8 strings.

Dann solltest Du Deine “Sonderzeichen” in UTF-8 umwandeln bevor Du es wegschickst.
Aus dieser Tabelle:
ö = c3 b6
ä = c3 a4

Nehme mal an das das “Stöhrung Leerzeichen Ende” usw heißen soll.
Dann siehst Du daß der Wert 0x94 dem “ö” entspricht. Ich weiß jetzt nicht welchen Wert Dein Zielsystem mit einem ö anzeigt.
Dann kannst Du wenn ein 0x94 hereinkommst die richtige Zahl weiterschicken oder ein oe 0x6f0 x65 daraus machst.
Grüße Uwe

vieleicht “Codepage 437” aus DOS zeiten.

ä 0x84
ö 0x94
ü 0x81
Ä 0x8e
Ö 0x99
Ü 0x9a
ß 0xE1

Ah Werner - danke!
Nach einer Kodierung hatte ich vorhin auch gesucht, aber das “finden” ist ja das Wichtige.

@TO:
Das Telegram das nicht annimmt liegt vermutlich daran, dass es kein UTF-8 Zeichen geben darf, dass mit Hex 8 oder 9 anfängt. Alles unter 0x80 (128) ist gleich wie ASCII, bei allen anderen müssen im ersten Byte mindestens die beiden obersten Bits gesetzt sein (0xC oder größer). 0x8 zeichnet dann die Folgebytes aus.

wno158:
Ah Werner - danke!
Nach einer Kodierung hatte ich vorhin auch gesucht, aber das “finden” ist ja das Wichtige.

@TO:
Das Telegram das nicht annimmt liegt vermutlich daran, dass es kein UTF-8 Zeichen geben darf, dass mit Hex 8 oder 9 anfängt. Alles unter 0x80 (128) ist gleich wie ASCII, bei allen anderen müssen im ersten Byte mindestens die beiden obersten Bits gesetzt sein (0xC oder größer). 0x8 zeichnet dann die Folgebytes aus.

Naja, es wird ja schon in der seriellen Konsole nicht richtig angezeigt.

Die kann auch nur ASCII. Nimm mal Putty, da kannst Du die Codepage einstellen (auch die 437)

Gruß Tommy

Stimmt, aber 437 kann er nicht ;)

Gruß Tommy

Tommy56:
Die kann auch nur ASCII. Nimm mal Putty, da kannst Du die Codepage einstellen (auch die 437)

Gruß Tommy

Ja, okay dann wird es richtig dargestellt. und was kann ich mit dem neuen wissen anfangen?

e_brandt: ... und was kann ich mit dem neuen wissen anfangen?

BMA ► Codewandlung ► Telegram

Also Codepage 437 wandeln in das Format, das Telegram haben möchte.

Du hast Dich doch in #9 beschwert, dass es nicht richtig angezeigt wird.
Den Lösungsansatz für die Umwandlung hast Du doch schon bekommen.

Gruß Tommy

noiasca: bevor du dich ans umwandeln machst: Dein "Empfänger" verschluckt doch Zeichen oder? Willst das vorher nicht beheben?

R a u c h m e d e r W e k s t a

das ist ein missverständniss, da habe ich beim Texte vergeben im Eifer des Gefächtes geschlafen, das kommt schon so aus der BMA :o

wno158: Dann solltest Du Deine "Sonderzeichen" in UTF-8 umwandeln bevor Du es wegschickst.

Damit meinte ich: Wenn Du in Deinen von der BMA eingelesenen Zeichen z.B. ein ö in Codepage 437-Kodierung entdeckst (0x84), schreibst Du stattdessen 0xC2 und 0xB6 in Deinen Telegram-Text.