From 29066a3b76a6e9ba5091c6d0d4a9dcd4d32a5b06 Mon Sep 17 00:00:00 2001 From: maidnl Date: Wed, 5 Jul 2023 11:08:46 +0200 Subject: [PATCH 1/2] fix for readString not working on UDP example, changed read_needed to read_if_needed --- libraries/WiFiS3/src/Modem.cpp | 23 ++++++++++++++++------- libraries/WiFiS3/src/WiFiClient.cpp | 16 +++++++++++----- libraries/WiFiS3/src/WiFiClient.h | 2 +- libraries/WiFiS3/src/WiFiSSLClient.cpp | 16 +++++++++++----- libraries/WiFiS3/src/WiFiSSLClient.h | 2 +- libraries/WiFiS3/src/WiFiUdp.cpp | 16 +++++++++++----- libraries/WiFiS3/src/WiFiUdp.h | 2 +- 7 files changed, 52 insertions(+), 25 deletions(-) diff --git a/libraries/WiFiS3/src/Modem.cpp b/libraries/WiFiS3/src/Modem.cpp index b1905e503..8b41dabe6 100644 --- a/libraries/WiFiS3/src/Modem.cpp +++ b/libraries/WiFiS3/src/Modem.cpp @@ -156,12 +156,19 @@ bool ModemClass::read_by_size_finished(string &rx) { int pos_space = rx.find(" "); if(pos != string::npos && pos_space != string::npos) { string n = rx.substr(pos_space,pos); - /* add 4 because OK\r\n is always added at the end of data */ - data_to_be_received = atoi(n.c_str()) + 4; - rx.clear(); - data_received = 0; - st = WAIT_FOR_DATA; - + int to_be_rx = atoi(n.c_str()); + if(to_be_rx <= 0) { + rv = true; + first_call = true; + st = IDLE; + } + else { + /* add 4 because OK\r\n is always added at the end of data */ + data_to_be_received = to_be_rx + 4; + data_received = 0; + st = WAIT_FOR_DATA; + } + rx.clear(); } } break; @@ -206,7 +213,9 @@ bool ModemClass::buf_read(const string &prompt, string &data_res) { found = true; read_by_size = false; res = true; - data_res = data_res.substr(0, data_res.length() - (sizeof(RESULT_OK) - 1)); + if(data_res.size() > 0) { + data_res = data_res.substr(0, data_res.length() - (sizeof(RESULT_OK) - 1)); + } } } else { diff --git a/libraries/WiFiS3/src/WiFiClient.cpp b/libraries/WiFiS3/src/WiFiClient.cpp index 5a08e7606..837979754 100644 --- a/libraries/WiFiS3/src/WiFiClient.cpp +++ b/libraries/WiFiS3/src/WiFiClient.cpp @@ -123,9 +123,15 @@ int WiFiClient::_read() { modem.read_using_size(); if(modem.write(string(PROMPT(_CLIENTRECEIVE)),res, "%s%d,%d\r\n" , CMD_WRITE(_CLIENTRECEIVE), _sock, size)) { - for(int i = 0, rv = 0; i < size && i < res.size(); i++) { - rx_buffer->store((uint8_t)res[i]); - rv++; + if(res.size() > 0) { + for(int i = 0, rv = 0; i < size && i < res.size(); i++) { + rx_buffer->store((uint8_t)res[i]); + rv++; + } + } + else { + this->flush(); + rv = 0; } } } @@ -133,7 +139,7 @@ int WiFiClient::_read() { } /* -------------------------------------------------------------------------- */ -bool WiFiClient::read_needed(size_t s) { +void WiFiClient::read_if_needed(size_t s) { /* -------------------------------------------------------------------------- */ if(rx_buffer != nullptr) { if((size_t)rx_buffer->available() < s) { @@ -155,7 +161,7 @@ int WiFiClient::read() { /* -------------------------------------------------------------------------- */ int WiFiClient::read(uint8_t *buf, size_t size) { /* -------------------------------------------------------------------------- */ - read_needed(size); + read_if_needed(size); int rv = 0; bool go_on = true; if(_sock >= 0 && rx_buffer != nullptr) { diff --git a/libraries/WiFiS3/src/WiFiClient.h b/libraries/WiFiS3/src/WiFiClient.h index 487ebc686..74b86f882 100644 --- a/libraries/WiFiS3/src/WiFiClient.h +++ b/libraries/WiFiS3/src/WiFiClient.h @@ -67,7 +67,7 @@ class WiFiClient : public Client { void getSocket(); std::shared_ptr> rx_buffer; int _read(); - bool read_needed(size_t s); + void read_if_needed(size_t s); void clear_buffer(); bool destroy_at_distructor; diff --git a/libraries/WiFiS3/src/WiFiSSLClient.cpp b/libraries/WiFiS3/src/WiFiSSLClient.cpp index a19d262eb..cdc67c2c6 100644 --- a/libraries/WiFiS3/src/WiFiSSLClient.cpp +++ b/libraries/WiFiS3/src/WiFiSSLClient.cpp @@ -124,9 +124,15 @@ int WiFiSSLClient::_read() { modem.avoid_trim_results(); modem.read_using_size(); if(modem.write(string(PROMPT(_SSLCLIENTRECEIVE)),res, "%s%d,%d\r\n" , CMD_WRITE(_SSLCLIENTRECEIVE), _sock, size)) { - for(int i = 0, rv = 0; i < size && i < res.size(); i++) { - rx_buffer->store((uint8_t)res[i]); - rv++; + if(res.size() > 0) { + for(int i = 0, rv = 0; i < size && i < res.size(); i++) { + rx_buffer->store((uint8_t)res[i]); + rv++; + } + } + else { + this->flush(); + rv = 0; } } } @@ -134,7 +140,7 @@ int WiFiSSLClient::_read() { } /* -------------------------------------------------------------------------- */ -bool WiFiSSLClient::read_needed(size_t s) { +void WiFiSSLClient::read_if_needed(size_t s) { /* -------------------------------------------------------------------------- */ if((size_t)rx_buffer->available() < s) { _read(); @@ -154,7 +160,7 @@ int WiFiSSLClient::read() { /* -------------------------------------------------------------------------- */ int WiFiSSLClient::read(uint8_t *buf, size_t size) { /* -------------------------------------------------------------------------- */ - read_needed(size); + read_if_needed(size); int rv = 0; bool go_on = true; for(int i = 0; i < size && go_on; i++) { diff --git a/libraries/WiFiS3/src/WiFiSSLClient.h b/libraries/WiFiS3/src/WiFiSSLClient.h index 3bea776f0..e0286f0e5 100644 --- a/libraries/WiFiS3/src/WiFiSSLClient.h +++ b/libraries/WiFiS3/src/WiFiSSLClient.h @@ -59,7 +59,7 @@ class WiFiSSLClient : public WiFiClient { bool _custom_root = false; void getSocket(); int _read(); - bool read_needed(size_t s); + void read_if_needed(size_t s); private: void upload_default_Cert(); diff --git a/libraries/WiFiS3/src/WiFiUdp.cpp b/libraries/WiFiS3/src/WiFiUdp.cpp index 18f99ea02..b7c434f78 100644 --- a/libraries/WiFiS3/src/WiFiUdp.cpp +++ b/libraries/WiFiS3/src/WiFiUdp.cpp @@ -180,9 +180,15 @@ int WiFiUDP::_read() { modem.avoid_trim_results(); modem.read_using_size(); if(modem.write(string(PROMPT(_UDPREAD)),res, "%s%d,%d\r\n" , CMD_WRITE(_UDPREAD), _sock, size)) { - for(int i = 0, rv = 0; i < size && i < res.size(); i++) { - rx_buffer.store((uint8_t)res[i]); - rv++; + if(res.size() > 0) { + for(int i = 0, rv = 0; i < size && i < res.size(); i++) { + rx_buffer.store((uint8_t)res[i]); + rv++; + } + } + else { + this->flush(); + rv = 0; } } } @@ -190,7 +196,7 @@ int WiFiUDP::_read() { } /* -------------------------------------------------------------------------- */ -bool WiFiUDP::read_needed(size_t s) { +void WiFiUDP::read_if_needed(size_t s) { /* -------------------------------------------------------------------------- */ if((size_t)rx_buffer.available() < s) { _read(); @@ -210,7 +216,7 @@ int WiFiUDP::read() { /* -------------------------------------------------------------------------- */ int WiFiUDP::read(unsigned char* buf, size_t size) { /* -------------------------------------------------------------------------- */ - read_needed(size); + read_if_needed(size); int rv = 0; bool go_on = true; for(int i = 0; i < size && go_on; i++) { diff --git a/libraries/WiFiS3/src/WiFiUdp.h b/libraries/WiFiS3/src/WiFiUdp.h index 9f5a3e6a0..3c212f339 100644 --- a/libraries/WiFiS3/src/WiFiUdp.h +++ b/libraries/WiFiS3/src/WiFiUdp.h @@ -39,7 +39,7 @@ class WiFiUDP : public UDP { protected: virtual int _read(); - virtual bool read_needed(size_t s); + virtual void read_if_needed(size_t s); public: WiFiUDP(); // Constructor From bc086b1418eca006062daaee3086bd55702cf3fe Mon Sep 17 00:00:00 2001 From: maidnl Date: Wed, 5 Jul 2023 14:32:05 +0200 Subject: [PATCH 2/2] fixing problem of missing connection after first iteration --- libraries/WiFiS3/src/Modem.cpp | 6 ++++++ libraries/WiFiS3/src/WiFiClient.cpp | 1 - libraries/WiFiS3/src/WiFiSSLClient.cpp | 1 - libraries/WiFiS3/src/WiFiUdp.cpp | 1 - 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/libraries/WiFiS3/src/Modem.cpp b/libraries/WiFiS3/src/Modem.cpp index 8b41dabe6..0d47e360a 100644 --- a/libraries/WiFiS3/src/Modem.cpp +++ b/libraries/WiFiS3/src/Modem.cpp @@ -158,6 +158,9 @@ bool ModemClass::read_by_size_finished(string &rx) { string n = rx.substr(pos_space,pos); int to_be_rx = atoi(n.c_str()); if(to_be_rx <= 0) { + while( _serial->available() ){ + _serial->read(); + } rv = true; first_call = true; st = IDLE; @@ -216,6 +219,9 @@ bool ModemClass::buf_read(const string &prompt, string &data_res) { if(data_res.size() > 0) { data_res = data_res.substr(0, data_res.length() - (sizeof(RESULT_OK) - 1)); } + else { + break; + } } } else { diff --git a/libraries/WiFiS3/src/WiFiClient.cpp b/libraries/WiFiS3/src/WiFiClient.cpp index 837979754..75043d02e 100644 --- a/libraries/WiFiS3/src/WiFiClient.cpp +++ b/libraries/WiFiS3/src/WiFiClient.cpp @@ -130,7 +130,6 @@ int WiFiClient::_read() { } } else { - this->flush(); rv = 0; } } diff --git a/libraries/WiFiS3/src/WiFiSSLClient.cpp b/libraries/WiFiS3/src/WiFiSSLClient.cpp index cdc67c2c6..7f1fa0dd5 100644 --- a/libraries/WiFiS3/src/WiFiSSLClient.cpp +++ b/libraries/WiFiS3/src/WiFiSSLClient.cpp @@ -131,7 +131,6 @@ int WiFiSSLClient::_read() { } } else { - this->flush(); rv = 0; } } diff --git a/libraries/WiFiS3/src/WiFiUdp.cpp b/libraries/WiFiS3/src/WiFiUdp.cpp index b7c434f78..08cc4b794 100644 --- a/libraries/WiFiS3/src/WiFiUdp.cpp +++ b/libraries/WiFiS3/src/WiFiUdp.cpp @@ -187,7 +187,6 @@ int WiFiUDP::_read() { } } else { - this->flush(); rv = 0; } }