Serial.print (SendString), aber niemand versteht mich!

Hallo,
ich sende mittels ESP32 und Serial.print (SendString) zwei Sonderzeichen über eine Virtuelle Maschine an ein VB6.0 Programm unter Win XP. (Muss sein und ist Sinn der Sache. Es geht um ein HardwareUpdate.)

Der ESP sendet die Daten korrekt, zumindest im eigenen Monitor. Unter Win XP kommt aber nur Quatsch an. Die Baudraten wurden schon x-mal überprüft und stimmen.
Das gute, alte Hyperterminal, zeig das gleiche Ergebnis.
Statt “¼¼” wird z.B. “<B” angezeigt, manchmal aber auch was anderes.
Kann es sein, daß der ESP mit unterschiedlichen CPU-Frequenzen irgendwelche Abweichungen hat, oder woran kann das sonst noch liegen?

Unspezifische Hilfeanfrage
Meine Standardantwort zu unspezifischen Hilfeanfragen:

Ich helfe gerne!

Ich bin mir recht sicher: Du machst was falsch!
Da Code und Aufbau geheim sind, gehe ich davon aus, dass du den Fehler selber suchen möchtest.

Also: Welche Form der Hilfe hättest du gerne?

Nachtag: Zeichensatz?

Der nahezu vollständige Code steht in der Überschrift.
Im Setup steht noch: Serial.begin(9600); (Default ist 8,n,1 ebenso wie unter Windows).
Eigentlich total easy.
Kann es sein, daß ich unter den Boardeigenschaften was vermurkst habe?
Wahrscheinlich liegt das an der Virtuellen Maschine...

Unter Win10 den Serial Port Monitor installiert. Gleicher Fehler.
Also liegt es nicht an der Umleitung über die VM oder an XP.
Dann habe ich das Sonderzeichen "¼" durch einen normalen Buchstaben ersetzt und sieheda, es funktioniert!
Anscheinend hat der ESP einen eingeschränkten Zeichensatz?

Anscheinend hat der ESP einen eingeschränkten Zeichensatz?

Nicht eingeschränkt!

Ja, die Zeichensätze....
Hunderte es gibt!
Und Codierungen gibts da auch noch einige...
wchar, utf8 bis utf32 usw.

Dein Editor und das Anzeigeprogramm haben offensichtlich unterschiedliche Zeichensätze/Codierungen eingestellt.

Darum ja auch meine Frage!

Wie kann ich denn den ESP dazu bringen dieses ¼ zu senden??? :o

Einen anderen Zeichensatz einstellen.
Natürlich beidseitig den gleichen.
Und natürlich sollte er auch dein 1/4 dann wirklich beinhalten.

Oder eben den Code senden, den die Gegenstation als 1/4 interpretiert.
In etwa so, oder so ähnlich:

#define EinGrossesT "\124"

void setup() 
{
  Serial.begin(9600);
  Serial.print("123" EinGrossesT "456");
}

void loop() 
{

}

schau dir mal mit einem Terminal das direkt in HEX darstellen kann an, was du wirklich an Daten erhältst.
Wenn du

¼

sendest, und du

c2 bc

empfängst, ist imho alles gut, und du lässt dich nur von abweichenden Zeichensätzen verwirren und fischt im trüben.

PS: Diese Seiite mit der UTF 8 Tabelle hat mir bisher sehr geholfen.

Zumindest kann der ESP mit anderen Zeichensätzen und Codierungen umgehen.
Bei unseren kleinen AVRs fehlts da an Substanz.

Serial.println(std::wcslen(L"abc¼efg")); // zeigt die korrekte 7 (ESP)
// sizeof() zeigt dann sicherlich die korrekten 18 Byte an (ungetestet)

Serial.println(strlen("abc¼efg")); // zeigt die falsche 8 (AVR)

Serial.println(strlen("abc¼efg")); // zeigt die falsche 8 (AVR)

Wobei ich nicht verstehe, was da an 8 falsch ist. Der Compiler arbeitet mit dem utf-8 Zeichensatz. Und a sind das 8 Byte (plus eines abschliessenden '\0')

Windows XP VB6.0 arbeitet vermutlich mit ANSI (Windows-1252). Da ist ¼ das Zeichen 0xBC = 188 = 0274(oktal).
Probier mal doch mal, was bei "abc\274efg" in deinem VB Programm ankommt.

Wenn das auch nicht passt, weißt du immerhin, wo du weiter suchen musst :slight_smile:

Wobei ich nicht verstehe, was da an 8 falsch ist.

strlen() soll die Anzahl Zeichen liefern
Das tut es nicht, wenn UTF-8 Zeichen enthalten sind.

Und a sind das 8 Byte (plus eines abschliessenden '\0')

Um die Anzahl Bytes zu liefern wurde sizeof() erfunden.

Der Compiler arbeitet mit dem utf-8 Zeichensatz.

Das bezieht sich auf Bezeichner usw.
Und auch nur auf modernen Compilern.

Wenn man Strings als UTF-8 definieren möchte muss man das so tun:

Serial.println(u8"Teststring¼Testende");
Das heißt aber nicht , dass strlen() dann mit so einem String korrekt umgeht!
Das tut es nämlich nicht.
Dafür sind andere Funktionen der std Lib zuständig, welche bei den AVR leider nicht vorliegen.
Beim ESP allerdings schon.
Von daher hier kein Problem.

Das Problem hier ist allerdings, dass die Zielmaschine (VB6.0 auf Windows XP) wohl nicht an utf-8 denkt, aber (zumindest im Beispiel hier) vorgesetzt bekommt.

Dass "abc¼efg" im Arduino als utf-8 abgelegt wird,
was die AVR Funktion strlen damit macht,
dass avrgcc wcslen gar nicht kennt,
und inwieweit die Arduino toolchain für ESP32 verbesserungsfähig oder konfigurierbar ist,

sind sicher die generell interessanteren Fragen (aber OT hier).

Ohne Beteiligung des TO ist das irgendwie fad.

Ich bleib dabei:
Er soll sich auf seiner Zielmaschine anschauen, was wirklich ankommt. Imho verwirrt er sich nur selber.

Der ESP sendet sauber das was man ihm programmiert, richtig anschauen muss man es halt.

in klein:

void setup() {
  Serial.begin(115200);
}

void loop() {
  Serial.print("¼");
  delay(2000);
}

wcslen ...
und inwieweit die Arduino toolchain für ESP32 verbesserungsfähig oder konfigurierbar ist,

Doch doch...
Der ESP kann das.

Aus meiner Sicht macht es Sinn, sich beim Serialprotokoll an die ASCII-Tabelle zu halten.

harryberlin:
Aus meiner Sicht macht es Sinn, sich beim Serialprotokoll an die ASCII-Tabelle zu halten.

Womit dann incl. Steuerzeichen nur 127 Zeichen übrig bleiben, denn größer ist sie nicht.
Auch Umlaute usw gehen so verschütt.

Richtig. Oder man waagt es die erweiterte Ascii zu nutzen und bleibt so immer noch bei einem Byte.

Oder man waagt es die erweiterte Ascii zu nutzen und bleibt so immer noch bei einem Byte.

Das wurde früher codepage genannt, und da gab es mehrere. Wenn man rausgefunden hat, welche erwartet wird, muss man diese Zeichen nur noch richtig erzeugen.