diff --git a/TinyGsmClientA6.h b/TinyGsmClientA6.h index 4b9e80e..e7549bf 100644 --- a/TinyGsmClientA6.h +++ b/TinyGsmClientA6.h @@ -441,6 +441,9 @@ public: String r5s(r5); r5s.trim(); DBG("### ..:", r1s, ",", r2s, ",", r3s, ",", r4s, ",", r5s);*/ data.reserve(64); + bool gotData = false; + int mux = -1; + int len = 0; int index = 0; unsigned long startMillis = millis(); do { @@ -465,24 +468,24 @@ public: index = 5; goto finish; } else if (data.endsWith(GF("+CIPRCV:"))) { - int mux = streamReadUntil(',').toInt(); - int len = streamReadUntil(',').toInt(); - if (len > sockets[mux]->rx.free()) { - DBG("### Buffer overflow: ", len, "->", sockets[mux]->rx.free()); - } else { - DBG("### Got: ", len, "->", sockets[mux]->rx.free()); - } - while (len--) { - while (!stream.available()) {} - sockets[mux]->rx.put(stream.read()); - } - data = ""; - return index; + mux = stream.readStringUntil(',').toInt(); + data += mux; + data += (','); + len = stream.readStringUntil(',').toInt(); + data += len; + data += (','); + gotData = true; + index = 6; + goto finish; } else if (data.endsWith(GF("+TCPCLOSED:"))) { - int mux = streamReadUntil(',').toInt(); - streamReadUntil('\n'); + mux = stream.readStringUntil(',').toInt(); + data += mux; + data += (','); + String concl = stream.readStringUntil('\n'); + data += concl; sockets[mux]->sock_connected = false; - data = ""; + index = 7; + goto finish; } } } while (millis() - startMillis < timeout); @@ -492,7 +495,6 @@ public: if (data.length()) { DBG("### Unhandled:", data); } - data = ""; } else { data.trim(); @@ -501,7 +503,23 @@ public: if (data.length()) { DBG(GSM_NL, "<<< ", data); } - data = ""; + } + if (gotData) { + int len_orig = len; + if (len > sockets[mux]->rx.free()) { + DBG(GSM_NL, "### Buffer overflow: ", len, "->", sockets[mux]->rx.free()); + } else { + DBG(GSM_NL, "### Got: ", len, "->", sockets[mux]->rx.free()); + } + while (len--) { + char c[2] = {0}; + stream.readBytes(c, 1); // readBytes includes a timeout + if(c[0]) sockets[mux]->rx.put(c[0]); + // DBG(GSM_NL, c[0], " ", len, " ", stream.available(), " ", sockets[mux]->available()); + } + if (len_orig > sockets[mux]->available()) { + DBG(GSM_NL, "### Fewer characters received than expected: ", len_orig, "->", sockets[mux]->available()); + } } return index; } diff --git a/TinyGsmClientM590.h b/TinyGsmClientM590.h index 7cee3fe..776091a 100644 --- a/TinyGsmClientM590.h +++ b/TinyGsmClientM590.h @@ -448,6 +448,9 @@ public: String r5s(r5); r5s.trim(); DBG("### ..:", r1s, ",", r2s, ",", r3s, ",", r4s, ",", r5s);*/ data.reserve(64); + bool gotData = false; + int mux = -1; + int len = 0; int index = 0; unsigned long startMillis = millis(); do { @@ -472,24 +475,24 @@ public: index = 5; goto finish; } else if (data.endsWith(GF("+TCPRECV:"))) { - int mux = streamReadUntil(',').toInt(); - int len = streamReadUntil(',').toInt(); - if (len > sockets[mux]->rx.free()) { - DBG("### Buffer overflow: ", len, "->", sockets[mux]->rx.free()); - } else { - DBG("### Got: ", len, "->", sockets[mux]->rx.free()); - } - while (len--) { - while (!stream.available()) {} - sockets[mux]->rx.put(stream.read()); - } - data = ""; - return index; + mux = stream.readStringUntil(',').toInt(); + data += mux; + data += (','); + len = stream.readStringUntil(',').toInt(); + data += len; + data += (','); + gotData = true; + index = 6; + goto finish; } else if (data.endsWith(GF("+TCPCLOSE:"))) { - int mux = streamReadUntil(',').toInt(); - streamReadUntil('\n'); + mux = stream.readStringUntil(',').toInt(); + data += mux; + data += (','); + String concl = stream.readStringUntil('\n'); + data += concl; sockets[mux]->sock_connected = false; - data = ""; + index = 7; + goto finish; } } } while (millis() - startMillis < timeout); @@ -499,7 +502,6 @@ public: if (data.length()) { DBG("### Unhandled:", data); } - data = ""; } else { data.trim(); @@ -508,7 +510,23 @@ public: if (data.length()) { DBG(GSM_NL, "<<< ", data); } - data = ""; + } + if (gotData) { + int len_orig = len; + if (len > sockets[mux]->rx.free()) { + DBG(GSM_NL, "### Buffer overflow: ", len, "->", sockets[mux]->rx.free()); + } else { + DBG(GSM_NL, "### Got: ", len, "->", sockets[mux]->rx.free()); + } + while (len--) { + char c[2] = {0}; + stream.readBytes(c, 1); // readBytes includes a timeout + if(c[0]) sockets[mux]->rx.put(c[0]); + // DBG(GSM_NL, c[0], " ", len, " ", stream.available(), " ", sockets[mux]->available()); + } + if (len_orig > sockets[mux]->available()) { + DBG(GSM_NL, "### Fewer characters received than expected: ", len_orig, "->", sockets[mux]->available()); + } } return index; } diff --git a/TinyGsmClientXBee.h b/TinyGsmClientXBee.h index e88f43d..5ca7a8b 100644 --- a/TinyGsmClientXBee.h +++ b/TinyGsmClientXBee.h @@ -312,10 +312,6 @@ public: commandMode(); - sendAT(GF("AP"), 0); // Put in transparent mode - waitResponse(); - sendAT(GF("IP"), 1); // Put in TCP mode - waitResponse(); sendAT(GF("EE"), 2); // Set security to WPA2 waitResponse(); @@ -348,10 +344,6 @@ public: */ bool gprsConnect(const char* apn, const char* user = "", const char* pw = "") { commandMode(); - sendAT(GF("AP"), 0); // Put in transparent mode - waitResponse(); - sendAT(GF("IP"), 1); // Put in TCP mode - waitResponse(); sendAT(GF("AN"), apn); // Set the APN waitResponse(); writeChanges(); @@ -375,8 +367,6 @@ public: bool sendSMS(const String& number, const String& text) { commandMode(); - sendAT(GF("AP"), 0); // Put in transparent mode - waitResponse(); sendAT(GF("IP"), 2); // Put in text messaging mode waitResponse(); sendAT(GF("PH"), number); // Set the phone number @@ -493,9 +483,11 @@ private: host += ip[2]; host += "."; host += ip[3]; - sendAT(GF("DL"), host); + sendAT(GF("IP"), 1); // Put in TCP mode + waitResponse(); + sendAT(GF("DL"), host); // Set the "Destination Address Low" waitResponse(); - sendAT(GF("DE"), String(port, HEX)); + sendAT(GF("DE"), String(port, HEX)); // Set the destination port int rsp = waitResponse(); return rsp; }