Ich habe das Problem, dass ich einen mit unbekannter Länge empfangen String über SoftwareSerial() lesen will.
Hier wird aber immer am Ende abgebrochen.
Wie kann man dieses Problem in den Griff bekommen bzw wo liegen die Grenzen?
Ich habe das Problem, dass ich einen mit unbekannter Länge empfangen String über SoftwareSerial() lesen will.
Hier wird aber immer am Ende abgebrochen.
Wie kann man dieses Problem in den Griff bekommen bzw wo liegen die Grenzen?
Ja!
Tut mir leid wenn ich Schwachsinn poste, aber dann wär es gut, wenn du mir auch mitteilst, warum ich so eine AW verdiene..
OK:
Mein:
combie:
Ja!
bedeutet, "ich höre dir zu".
Nimm es als ein Zeichen dafür, dass ich dich nicht ignoriere.
alles klar. Gut.
Arduino Mega 2560
wo kann ich dass nachlesen?
mein Code holt sich über softserial SMS Daten von einem GSM Modem. Bis zur 2. Nachricht klappt dass, nur ist dann zum Ende hin die letzten 3-5 Zeichen Müll und es sieht nicht dannac aus, dass die Zeichen die letzten sind (von der größe der AW).
Issuing command: AT+CMGL="REC UNREAD"
REPLY:
REPLY:
+CMT: "+436768344",,"2017/10/20,16:24:13+02",145,17,0,0,"
REPLY:
+CMT: "+436768344",,"2017/10/20,16:24:13+02",145,17,0,0,"
+CMGL: 1,"REC UNREAD","+4367683446284",,"2017/10/20,16:24:13+02",145,35
REPLY:
+CMT: "+436768344",,"2017/10/20,16:24:13+02",145,17,0,0,"
+CMGL: 1,"REC UNREAD","+4367683446284",,"2017/10/20,16:24:13+02",145,35
SEND: AT+CPMS=ME,ME,ME e@e@ No: 8
REPLY:
+CMT: "+436768344",,"2017/10/20,16:24:13+02",145,17,0,0,"
+CMGL: 1,"REC UNREAD","+4367683446284",,"2017/10/20,16:24:13+02",145,35
SEND: AT+CPMS=ME,ME,ME e@e@ No: 8
REPLY:
+CMT: "+436768344",,"2017/10/20,16:24:13+02",145,17,0,0,"
+CMGL: 1,"REC UNREAD","+4367683446284",,"2017/10/20,16:24:13+02",145,35
SEND: AT+CPMS=ME,ME,ME e@e@ No: 8
es wird solange gelesen bis ein Timeout oder OK kommt..
Der Arduino Mega 2560 hat 4 mal Hardware Serial.
Da brauchst du kein Software Serial.
Oder?
In wie fern ist das relevant? Ich wollte es flexibel halten wegen der möglichkeit nano's auch verwenden zu können
Wenn eine Software Schnittstelle nötig ist sollte man AltSoftSerial verwenden. Das ist weniger fehleranfällig.
Da werden die Rx Tx im *.h File definiert oder?
AltSoftSerial verwendet einen Hardware Timer. Dadurch sind die Pins vom Prozessor vorgegeben
Dann sehe ich keinen unterschied zu den onboard seriellen ports
Natürlich gibt es da einen Unterschied. Hardware Serial ist immer noch wesentlich besser. Und nicht alle Arduinos haben zwei Hardware Schnittstellen
trotzdem kenne ich die Begrenzungen noch nicht
btw hab auf HW Serial umgestellt, selbes problem..
Nun...
Nur mal angenommen...
Du würdest in deinem Programm irgendwas falsch machen...
Ich weiß, dir scheint das völlig unmöglich zu sein.
Aber nur mal angenommen....
ich hab doch schon herumgestrickt.
Fakt ist, das alles kommt wie es soll, nur da, wo ich eine lange Liste bekommen sollte, wird abgebrochen.
Also geh ich davon aus, dass entweder eine Begreinzung beim Serial Buffer ist oder irgend ein Timeout oder miene Stringvariable voll ist..
do {
reply += Serial2.readString();
if (reply != ""){Serial.println("REPLY: " + reply);}
yield(); //Passes control to other tasks when called. Ideally yield() should be used in functions that will take awhile to complete.
} while (((reply.indexOf(resp1) + reply.indexOf(resp2)) == -2) && ((millis() - entry) < timeout)); // do wjile not strings found and timeout not done
Serial2.flush();
so wird der Buffer ausgelesen..
resp 1 und 2 sind wörter die in der AW vorkommen sollen, das andere is ein timeout.
Die AW sieht so aus:
Issuing command: AT+CMGL="REC UNREAD"
REPLY:
+CMGL: 1,"REC UNREAD","+4367683446284",,"2017/10/21,10:44:55+02"
AT+CMGS="067683446284
Serial2.readString();
Wer kann das ahnen.....
Aus: Serial.available() - Arduino Reference
serial receive buffer (which holds 64 bytes)
Es dürfte also keine gute Idee sein readString() zu benutzen, wenn man mit Strings länger als 64 Zeichen umgehen möchte.
Vergiss Methoden die irgendwie einen ganzen String auf einmal lesen. Das führt zu nichts. Lies per Hand Zeichen für Zeichen ein bis das Endzeichen kommt.
Und wenn du die String Klasse verwendest, verwende am Anfang reserve()!
Ist zwar ein Mega, aber String würde ich selbst da nicht nehmen. Und blockierende Schleifen auch nicht. Yield() bringt da auch nicht wirklich viel, außer du nutzt die Taskmacros.
Ich mache jede Wette, dass der Fehler im nicht öffentlichen Teil des Sketches zu finden ist.
aber String würde ich selbst da nicht nehmen.
Korrekt angewandt, könnte das hier aber helfen....