Ascii daten an ESP32 Webserver übergeben

Hallo,
bin neue aber habe schon einiges im Forum gelesen.
Habe nun ein Problem mit der Formatierung bei sprintf zur Ausgabe auf meiner Seite.
Ich erhalte von einem Gerät Daten über die Serielleschntitstelle, unter anderem auch Text und würde diesen Text gerne auf meiner Seite als Ascii-Text ausgeben und genau hier liegt mein Problem und vieleicht hat mir ja jemand einen Tipp.
Statische Texte kann ich als String anlegen und mit der Formatierung "%s" übergeben.
Das ganze entstand aus der Anleitung von Heinz Baumstark, hierfür auch meinen Dank.

include "WiFi.h"
#include  "WebServer.h"

const char* ssid = "????";                 // Network name.
const char* password = "12345";        // Password network.
uint32_t wert1, wert2, wert3, wert4, wert5;

char lcdData1[16] = {0x64, 0x69, 0x65, 0x73, 0x20, 0x69, 0x73, 0x74, 0x20, 0x65, 0x69, 0x6E, 0x20, 0x54 , 0x65, 0x78 , 0x74, 0x21}; Beispiel Daten "dies ist ein Text!"

byte ledpin1 = 23;
byte ledpin2 = 22;
byte ledpin3 = 19;
bool btnstate1;   // Status des HTLM Butons
bool btnstate2;
bool btnstate3;

// Server Instanz erstellen
WebServer server(80);

void setup() 
{
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  } 
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  // --Server Handle einrichten---
  server.serveStatic("/", SPIFFS, "/index.html");
  server.serveStatic("/style.css", SPIFFS, "/style.css", "text/css");
  server.on("/daten", sendeDaten);
  server.onNotFound(handleNotFound);   // Fehler bearbeiten
  
  char lcdData1[16] = {0x64, 0x69, 0x65, 0x73, 0x20, 0x69, 0x73, 0x74, 0x20, 0x65, 0x69, 0x6E, 0x20, 0x54 , 0x65, 0x78 , 0x74, 0x21};
}

void loop() 
{
  server.handleClient();// hier passiert sonst nichts
    //Beispiel m Werte auf Internetseite zu simulieren
  if (millis() - altzeit >= 400) { // Messwerte simulieren 400ms
    altzeit = millis();
    wert1++;
    if (wert1 > 2000)
    {
      wert1 = 0;
      wert5++;
    }
    wert2 = millis() / 1000;
    wert3 = 50.0 + random(10) / 5.0;
    wert4 = (wert2 + wert1);  
  }
}

void Datenzeigen() 
{
  String message = "Daten angekommen\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) 
  {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
 
  Serial.println(message);
}

void sendeDaten() 
{
  char sendbuffer[60];

 // JSON String als Array anlegen ["20.0","572.6","24.0"]
//  sprintf(sendbuffer, "[\"%4.1f\",\"%4.1f\",\"%4.1f\",\"%1u\",\"%1u\",\"%1u\"]",
//          wert1, wert2, wert3, wert4, wert5);
   sprintf(sendbuffer, "[\"%4d\",\"%4d\",\"%4d\",\"%4d\",\"%4d\",\"%16c\"]",    //Formatierung mit sprintf
                          wert1, wert2, wert3, wert4, wert5, lcdData1);        
  server.send(200, "application/json", sendbuffer);
  #ifdef DEBUG
  Serial.print(sendbuffer);
  Serial.println(strlen(sendbuffer));
  #endif
}

C-Strings werden mit einem Null-Byte beendet. Bei Statischen Strings wird das impliziet angehängt.

D.h. wenn du deinen empfangenen String mit printf() benutzen willst, am besten eine 0x00 anhängen.

Alternativ kannst du die Länge auch mit einem * angeben, wenn die Länge variabel ist:

printf("%.*s", length, data);
1 Like

Super, hat geklappt mit folgendem Format.

sprintf(sendbuffer, "[\"%4d\",\"%4d\",\"%4d\",\"%4d\",\"%4d\",\"%.*s\"]",    //Formatierung mit sprintf
         wert1, wert2, wert3, wert4, wert5, 16, lcdData1);        

Danke

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.