Komme einfach nicht weiter und brauche Hilfe. Mein Problem ich sende z.B . einen String "motor:22"
zum überprüfen wird der gleiche String zurückgesendet und mit dem String der gesendet wurde verglichen, ich krieg keine Übereinstimmung???? Habe jetzt festgestellt das der String "motor:22" eine Länge von 8 hat, kommt an mit Länge 10,also wird beim jeden Sendevorgang um 2erhöht,warum??? vergleich mache ich mit (gesendete_string.equals(empfangen)) angezeigt durch Serial.println(gesendete_string); und Serial.println(empfangen); das gleiche "motor:22" aber wie gesagt die Länge ändert sich, wie kann ich das umgehen???
Ich hoffe ich wurde verstanden.
int buflen;
buflen=empfangen.length(); //zeigt bei mir 10 an
int buflen;
buflen=gesendete_string.length();//der string der gesendet wurde hatte eine länge von 8
if (gesendete_string.equals(empfangen)) {
modus=0;
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0, 14);
display.print("*OKAY*");
display.display();
delay(3000);
}
Das Codefraqgment hat keinen Nutzen zur Problemklärung. Dazu braucht es schon die beiden Sletche (Sende- und Empfangsseite)
Nur von der Längeninfo her vermutet: Du sendest CR + LF zurück?
Also zeige beide Sketche.
Gruß Tommy
Tommy56:
Das Codefraqgment hat keinen Nutzen zur Problemklärung. Dazu braucht es schon die beiden Sletche (Sende- und Empfangsseite)
Nur von der Längeninfo her vermutet: Du sendest CR + LF zurück?
Also zeige beide Sketche.
Gruß Tommy
da blickt ein Fremde nicht durch............nicht das ich das nicht möchte...hmm " Du sendest CR + LF zurück?"
das habe ich auch vermutet... mySerial.println("motor:22"); so wird gesendet.... wie kann ich das umgehen????was passiert dabei den???
Hallo,
lasse Dir das doch mal in einem Terminal-Programm ausgeben.
Dann kannst Du "sehen" was tatsächlich passiert.
Gruß und Spaß
Andreas
parabello:
mySerial.println("motor:22"); so wird gesendet....
Und wieso wundert es dich dann dass da zwei Zeichen mehr ankommen als du willst?
Serenifly:
Und wieso wundert es dich dann dass da zwei Zeichen mehr ankommen als du willst?
kann ich die wieder abziehen???? wen ja wie???
Neben println() gibt es auch noch print()
Wobei es generell praktisch ist ein LF oder CR als Endzeichen zu senden. Und dann die Einlese-Routine per Hand zu schreiben, so dass sie alles bis da hin einliest. Bei den fertigen Methoden musst du aber aufpassen wie viel da tatsächlich gelesen wird.
Vlt. hat das was mit der Definition des String zu tun.
string Meinstring = "abc";
ist ganz was anderes als
char Meinstring[] = "abc";
Nein. Die interne Darstellung ist die gleiche
Glaub' ich nicht!
Bei der String darstellung dürften noch Informationen zur Länge des String mit abgelegt sein oder ein Ende Zeichen für das Ende des String....
Gucktst Du:
// char Meinstring[] = "abc";
String Meinstring[] = "abc";
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
Mal der eine Code, mal der andere Code kompiliert ergibt:
Informationen zur Länge des String
Na und? Das hat mit dem Inhalt des Strings an sich nichts zu tun
ein Ende Zeichen für das Ende des String.
Die String Klasse verwaltet intern auch nur ein Null-terminiertes Array. Was auch sonst?
... na dann gib' doch mal einen char[] ohne abschliessendes /0 per printf aus... Gibt die tollsten Ergebnisse!
und die Länge des sketches und der Speicherverbrauch ist ebenfalls unterschiedlich!
Dass die "Nutzinformation" die gleiche ist, hab ich nie bestritten!
Willst du das ernsthaft mit Serenifly diskutieren?
hajos118:
na dann gib' doch mal einen char[] ohne abschliessendes /0 per printf aus... Gibt die tollsten Ergebnisse!
Klar. Die String Klasse verwaltet intern auch ein char Array. Halt ein dynamisches dass mit der Größe des Strings wächst. Durch die Kapselung in der Klasse ist auch garantiert dass es terminiert ist
Dass die "Nutzinformation" die gleiche ist, hab ich nie bestritten!
Das aber das einzige was hier relevant ist. Der Overhead spielt für einen Vergleich oder die Ausgabe keine Rolle
Normal rate ich ja von der Verwendung der String Klasse ab. Das ist hier aber nicht das Problem. Wenn er char[] verwenden würde und den empfangenen String mit println() zurück sendet kommt genau das gleiche heraus.
Das Problem wird sein dass er nicht bis zu einem Endzeichen einliest, sondern einfach readString() macht. Also mit Timeout so lange einlesen wie Zeichen da sind. Und damit wird auch prompt das CR + LF eingelesen
Serenifly:
Nein. Die interne Darstellung ist die gleiche
Das ist die Aussage, die ich in Zweifel gestellt habe, und genau das bestätigt mir Serenifly mit:
Klar. Die String Klasse verwaltet intern auch ein char Array. Halt ein dynamisches dass mit der Größe des Strings wächst. Durch die Kapselung in der Klasse ist auch garantiert dass es terminiert ist
Also fixes char array gegen dynamisches, welches auch noch intern verwaltet wird.
Damit ist die interne Darstellung eindeutig nicht die gleiche. q.e.d.