Przesyłanie danych typu INT/FLOAT poprzez UDP z ESP do ESP

0

Witam serdecznie

wczoraj pol dnia glowilem sie nad pewnym tematem i nic nie wymyslilem, robie zdalny system pomiarowy w ktorym kilka modulów WiFi (jeden glowny ESP32 jest serverem, pozostale 8266 to klienci) beda zbierac dane z czujnikow, wysylac po UDP (moze w przyszlosci TCP) do serwera a stamtad powedruja na jakas strone/apke.

Mam zrobiona na esp komunikacje UDP zarowno po stronie accespointa jak i klienta, natomiast przesylana ramka danych jest w formacie ASCII, problem (moze trywialny) to wyslanie i odebranie danych w formacie int/float (bo tego typu dane beda pochodzily z czujnikow). Probowalem roznych funkcji jak i sposobow rzutowania, zawsze arduino ide (bo w tym programuje ESP) zwraca mi bledy o niedozwolonej konwersji itp...
Wrzuce kod na ktorym poprawnie sa wysylane dane jednak tak jak pisalem jako tekst w ASCII:
Strona klienta:

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

WiFiUDP Udp;
unsigned int localUdpPort = 4210;  // local port to listen on
IPAddress ip(192, 168, 4, 1);

void setup()
{
  Serial.begin(115200);
  Serial.println();

  WiFi.begin("ESP32", "123456789");

  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {

while (WiFi.status() != WL_CONNECTED)
{
  WiFi.reconnect();
  delay(10000);
  Serial.print(".Reconnected");
  Serial.println(WiFi.localIP());
}
Udp.beginPacket(ip, localUdpPort);
Udp.write("45"); // wysyłamy jeden bajt
Udp.endPacket();
Serial.print("Wyslalem cos\n");
delay(5000);
}

Jak widac wyslanie tekstu nie jest problemem ale nie umiem wyslac danych np z typu int, gdyz wysyla sie calkmien zmieniona wartosc

Na stronie serwera wyglada to tak:

#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiAP.h>
#include <WiFiUdp.h>
#include <stdlib.h>

WiFiUDP Udp;
unsigned int localUdpPort = 4210;  // local port to listen on
char incomingPacket[255];  // buffer for incoming packets


void setup()
{
  Serial.begin(115200);
  Serial.println();

  Serial.print("Setting soft-AP ... ");
  Serial.println(WiFi.softAP("ESP32", "123456789") ? "Ready" : "Failed!");
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);

  
  Udp.begin(localUdpPort);
  Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
}

void loop()
{
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    // receive incoming UDP packets
    Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
    int len = Udp.read(incomingPacket, 255);
    if (len > 0)
    {
      incomingPacket[len] = 0;
    }
    Serial.printf("UDP packet contents: %s\n", incomingPacket);
  }
}

Czy ktos moglby powiedziec albo moze wskazac przyklad jak poprzez UDP przeslac np float?
Bede wdzieczny za rady

3

Chcesz dane przesyłać jako łańcuchy znaków i je sobie konwertować, czy chcesz aby te dane faktycznie były int/float?

Jeśli to pierwsze to wystarczy kombinacja na przykład taka:

char buffer[16];
sprintf(buffer, "%d", jakaśliczba); // jeżeli długość liczby w zapisie przekroczy 16 znaków to źle, bo nie ma więcej miejsca w buforze
Udp.write(buffer, sizeof(char) * 16);

oraz:

String msg = String(incomingPacket);
int jakaśliczba = msg.toInt();
0

Dzieki za zainteresowanie tematem!

Idealnie byloby gdyby dalo sie z uzyciem funkcji Udp.read jako jej argument przeslac zmienna np pomiar typu float i tak samo ja odczytywac bez kombinowania

EDIT: Sprawdzilem i to rozwiaznaie sie sprawdza, stary bardzo Ci dziekuje! ! ! nawet nie wiesz jak mi pomogles, wczoraj kombinowalem roznymi funkcjami ale tej nie znalazlem, raz jeszcze dziekuje!

0

sprintf(buffer, "%d", jakaśliczba); // jeżeli długość liczby w zapisie przekroczy 16 znaków to źle, bo nie ma więcej miejsca w buforze
Udp.write(buffer, sizeof(char) * 16);

@Miksiorek: Hej, chciałbym skorzystać z tropu jaki jest podany na stronie ale z uwagi że temat jest stary a ja korzystam z nowszych bibliotek nie mogę poprawnie zdefiniować konwersji aby przesyłać poprawne dane z jakichś tam czujników. Pomożesz?
Nie rozpzoznaje poprawnie tej składni a Arduino.

1 użytkowników online, w tym zalogowanych: 0, gości: 1