• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос Низкая скорость передачи данных по TCP

Abel

New member
Имеется вот такой код, предназначеный для общения ардуины и esp через АТ-команды (прошивка esp v0.22SDK1.0.0). Использование связки ардуино+esp обязательно, потому что планирую передавать данные с нескольких сенсоров. Всё, в принципе, заработало. Но проблема вот в чём: данные приходят на TCP сервер с непостоянной скоростью - то есть 8-12 значений могут прийти очень быстро, но затем TCP просто висит 1-3 секунды, а затем всё повторяется, и в итоге, общая скорость передачи данных неприлично мала. Все данные приходят в целости - какие были отправлены с ардуины, такие и пришли на сервер. Собственно вопрос: это у меня корявый код или это особенности прошивки вкупе с TCP соединением? при реализации передачи данных с этого же датчика по UDP, и связи между esp и ардуино без АТ команд всё работает нормально.
Код:
код C++

#include <SoftwareSerial.h>
#include <WiFiUdp.h>

unsigned int LocalPort=5557;
int value, Length;
SoftwareSerial espMonitor(10,11);
IPAddress serverIP(192, 168, 0, 103);

void setup()
{
  Serial.begin(115200);
  espMonitor.begin(115200);
  delay(1000);
  espMonitor.println("AT+CWMODE=3");
  delay(1000);
  espMonitor.println("AT+CIPMUX=1");
  delay(1000);
  espMonitor.println("AT+CWJAP_CUR=\"ithome\",\"9519178980\"");
  delay(4000);
  if(espMonitor.find("OK"))
    Serial.println("WiFi connected");
  espMonitor.print("AT+CIPSTART=1,\"TCP\",\"");
  espMonitor.print(serverIP);
  espMonitor.print("\",");
  espMonitor.println(LocalPort);
  if(espMonitor.find("OK"))
    Serial.println("TCP connected");
}

void loop()
{
  //receive();
  value=analogRead(0);
  Serial.println(value);
  espMonitor.print("AT+CIPSEND=1,");
  if(value!=0) Length=lengthOfInt(value);
  else Length=1;
  espMonitor.println(Length);
  if(espMonitor.find(">"));
    espMonitor.println(value);
  if(espMonitor.find("SEND OK"))
    Serial.println("DATA sent");
}

void receive()
{
  String s;
  if(espMonitor.available())
  while(espMonitor.available())
     {s = s + espMonitor.readString();}
  Serial.println(s);
}

int lengthOfInt(int number)
{
  int result=0;
  while (number!=0)
  {
    number/=10;
    result++;
  }
  return result;
}
 
Сверху Снизу