• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос Передача данных по WiFi TCP. Приходят некорректные данные.

zik-888

New member
Прошу помощи, так как сил бороться больше нет. Посылаю по TCP с компа сообщение [набор чисел] + метка "JZ". Числа в виде short. Если одно из чисел оказывается меньше 256 (то есть содержат ноль в одном из двух байтов), то сообщение сразу превращается в нечитабельное, не удаётся считать даже последние символы, не смотря на то что длина сообщения корректная. С компа приходят точно корректные данные, проверял в приложении с телефона. Во всех остальных случаях всё работает и как-то не особо хочется колхозить велосипед.

Код:
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiAP.h>

#include <TCP_Stuct.h>

// Set these to your desired credentials.
const char *ssid = "yourAP";
const char *password = "yourPassword";

WiFiServer server(1024);
Joint6 joint;

void InitTCPWiFi(){
 
  pinMode(LED_BUILTIN, OUTPUT);

  Serial.begin(115200);
  Serial.println();
  Serial.println("Configuring access point...");

  // You can remove the password parameter if you want the AP to be open.
  WiFi.softAP(ssid, password);
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  server.begin();

  Serial.println("Server started");
}
void TestLoop() {
  WiFiClient client = server.available();   // listen for incoming clients

  if (client) {                             // if you get a client,
    Serial.println("New Client.");           // print a message out the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,

        currentLine= client.readString(); // читаю данные
        // print it out the serial monitor
        Serial.print("Data: ");
        Serial.println(currentLine);
        Serial.print("Data lenth: ");
        Serial.println(currentLine.length());
        if (currentLine.endsWith("JZ")){
          currentLine.remove(currentLine.length() - 2, 2);
          joint.IntoString(currentLine, 6); // здесь происходит запись в структуру, с ней всё в порядке
        }
      }
    }
    // close the connection:
    client.stop();
    Serial.println("Client Disconnected.");
  }
}
 

CodeNameHawk

Moderator
Команда форума
Посылаете
[набор чисел] + метка "JZ".
, а прочитать хотите строку типа String. Перед передачей преобразуйте числа в строку.
Ноль в строке признак конца строки.
 
Последнее редактирование:

CodeNameHawk

Moderator
Команда форума
Все такие
currentLine= client.readString(); // читаю данные
могут прочитать не целую строку ( особенно, если она длинная), а лишь ее часть( если еще не все данные поступили).
Если нужна надежность, посылаете признак начала строки- данные - признак конца строки, а на приемной стороне все собираете.
 
Сверху Снизу