From 1993b6daa726a17fc67e3e84271a3efd502c62dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20Felipe=20Dom=C3=ADnguez=20Vega?= Date: Tue, 22 Aug 2023 10:58:00 -0300 Subject: [PATCH] Fix SIM7600 error on send data of > 1400 bytes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Luis Felipe Domínguez Vega --- src/TinyGsmClientSIM7600.h | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/src/TinyGsmClientSIM7600.h b/src/TinyGsmClientSIM7600.h index 9f47c5d4..8f883e83 100644 --- a/src/TinyGsmClientSIM7600.h +++ b/src/TinyGsmClientSIM7600.h @@ -644,15 +644,33 @@ class TinyGsmSim7600 : public TinyGsmModem, } int16_t modemSend(const void* buff, size_t len, uint8_t mux) { - sendAT(GF("+CIPSEND="), mux, ',', (uint16_t)len); - if (waitResponse(GF(">")) != 1) { return 0; } - stream.write(reinterpret_cast(buff), len); - stream.flush(); - if (waitResponse(GF(GSM_NL "+CIPSEND:")) != 1) { return 0; } - streamSkipUntil(','); // Skip mux - streamSkipUntil(','); // Skip requested bytes to send - // TODO(?): make sure requested and confirmed bytes match - return streamGetIntBefore('\n'); + std::int16_t ret = 0; + constexpr std::size_t max_len = 1400; + + std::uint8_t cursor_buffer[max_len]; + auto buff_convert = reinterpret_cast(buff); + + for (size_t cursor = 0; cursor < len; cursor += max_len) + { + const size_t to_send = std::min(max_len, len - cursor); + + sendAT(GF("+CIPSEND="), mux, ',', (uint16_t)to_send); + if (waitResponse(GF(">")) != 1) { return 0; } + + std::copy(buff_convert + cursor, buff_convert + cursor + to_send, cursor_buffer); + + stream.write(cursor_buffer, to_send); + stream.flush(); + + if (waitResponse(GF(GSM_NL "+CIPSEND:")) != 1) { return 0; } + + streamSkipUntil(','); // Skip mux + streamSkipUntil(','); // Skip requested bytes to send + + ret = streamGetIntBefore('\n'); + } + + return ret; } size_t modemRead(size_t size, uint8_t mux) {