Skip to content

Commit

Permalink
Fix bug (freezes) when using a client that keep TCP connection live
Browse files Browse the repository at this point in the history
  • Loading branch information
andresarmento committed Oct 20, 2015
1 parent 8e7fc2a commit ca4c3ad
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 19 deletions.
37 changes: 18 additions & 19 deletions libraries/ModbusIP_ESP8266AT/ModbusIP_ESP8266AT.cpp
Expand Up @@ -21,29 +21,30 @@ void ModbusIP::config(ESP8266 &wifi, String ssid, String password) {
}

void ModbusIP::task() {

uint8_t buffer[128] = {0};
uint8_t mux_id;
uint32_t len = _wifi->recv(&mux_id, buffer, sizeof(buffer), 100);

if (len > 0) {
int i = 0;
while (i < 7) {
_MBAP[i] = buffer[i];
i++;
}
if (prev_conn) {
_wifi->stopTCPServer();
_wifi->enableMUX();
_wifi->startTCPServer(MODBUSIP_PORT);
_wifi->setTCPServerTimeout(10);
prev_conn = false;
}
uint32_t raw_len = _wifi->recv(&mux_id, buffer, sizeof(buffer), MODBUSIP_TIMEOUT);

if (raw_len > 7) {

for (int i = 0; i < 7; i++) _MBAP[i] = buffer[i]; //Get MBAP

_len = _MBAP[4] << 8 | _MBAP[5];
_len--; // Do not count with last byte from MBAP
if (_MBAP[2] !=0 || _MBAP[3] !=0) return; //Not a MODBUSIP packet
if (_len > MODBUSIP_MAXFRAME) return; //Length is over MODBUSIP_MAXFRAME

_frame = (byte*) malloc(_len);
i = 0;
while (i < _len){
_frame[i] = buffer[7+i]; //Forget MBAP and take just modbus pdu
i++;
}

for (int i=0; i < _len; i++) _frame[i] = buffer[7+i]; //Get Modbus PDU

this->receivePDU(_frame);

Expand All @@ -55,15 +56,13 @@ void ModbusIP::task() {
buffer[4] = _MBAP[4];
buffer[5] = _MBAP[5];

i = 0;
while (i < _len){
buffer[i+7] = _frame[i];
i++;
}
for (int i=0; i<_len; i++) buffer[i+7] = _frame[i];

_wifi->send(mux_id, buffer, _len + 7);
}

_wifi->releaseTCP(mux_id);
prev_conn = true;

free(_frame);
_len = 0;
}
Expand Down
1 change: 1 addition & 0 deletions libraries/ModbusIP_ESP8266AT/ModbusIP_ESP8266AT.h
Expand Up @@ -17,6 +17,7 @@ class ModbusIP : public Modbus {
private:
byte _MBAP[7];
ESP8266* _wifi;
bool prev_conn;
public:
ModbusIP();
void config(ESP8266 &wifi, String ssid, String password);
Expand Down

0 comments on commit ca4c3ad

Please sign in to comment.