• Система автоматизации с открытым исходным кодом на базе 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(); // читаю данные
могут прочитать не целую строку ( особенно, если она длинная), а лишь ее часть( если еще не все данные поступили).
Если нужна надежность, посылаете признак начала строки- данные - признак конца строки, а на приемной стороне все собираете.
 
Сверху Снизу