Mit UDP zum seriellen Monitor

Hallo, da man ja mit OTA keine serielle Schnittstelle mehr zum Debuggen zur Verfügung hat habe ich das mal mit UDP probiert . Der serielle Monitor und auch der serielle Plotter funktionieren ganz normal, es muss nur das serial.println gegen das udp.println getauscht werden.

Hier der Scetch für den ESP am PC, dieser empfängt per UDP die Daten und sendet sie ganz normal über das USB Kabel zum PC. Dies ist ganz genau der Scetch aus den Demos nur einige serielle Augaben sind weggelassen.

/*
  UDPSendReceive.pde:
  This sketch receives UDP message strings, prints them to the serial port
  and sends an "acknowledge" string back to the sender

  A Processing sketch is included at the end of file that can be used to send
  and received messages for testing with a computer.

  created 21 Aug 2010
  by Michael Margolis

  This code is in the public domain.

  adapted from Ethernet library examples
*/


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

#ifndef STASSID
#define STASSID "xxx"
#define STAPSK  "xxx"
#endif

unsigned int localPort = 8888;      // Port an diesem ESP

// buffers for receiving and sending data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE + 1]; //buffer to hold incoming packet,
char  ReplyBuffer[] = "acknowledged\r\n";       // a string to send back

WiFiUDP Udp;

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println();
  WiFi.mode(WIFI_STA);
  WiFi.begin(STASSID, STAPSK);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(500);
  }
  Serial.println();
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());
  Serial.printf("UDP server on port %d\n", localPort);
  Udp.begin(localPort);
}

void loop() {
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    /*   Serial.printf("Received packet of size %d from %s:%d\n    (to %s:%d, free heap = %d B)\n",
                     packetSize,
                     Udp.remoteIP().toString().c_str(), Udp.remotePort(),
                     Udp.destinationIP().toString().c_str(), Udp.localPort(),
                     ESP.getFreeHeap());*/

    // read the packet into packetBufffer
    int n = Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    packetBuffer[n] = 0;
    //Serial.println("Contents:");
    Serial.println(packetBuffer);

    // send a reply, to the IP address and port that sent us the packet we received
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ReplyBuffer);
    Udp.endPacket();
  }
}

/*
  test (shell/netcat):
  --------------------
    nc -u 192.168.esp.address 8888
*/

Hier für den ESP der per OTA programmiert wird.

#include <ESP8266WiFi.h>
#include <WiFiUDP.h>

const byte analogPin = A0;
int analogWert;
unsigned long intervallSendezeit;

//wifi connection variables
#ifndef STASSID
#define STASSID "xxx" //SSID
#define STAPSK  "xxx6" //Passwort
#endif

unsigned int localPort = 8889;      // Port an diesem ESP
unsigned int serverPort = 8888;      // Port des gerufenen  UDP Servers
char address[] = "192.168.2.81"; // IP des gerufenen UDP Servers
WiFiUDP Udp;

// buffers for receiving and sending data
char ankoBytes[100];  //buffer to hold incoming packet,
char  ReplyBuffer[] = "ok";       // a string to send back


void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.println();
  WiFi.mode(WIFI_STA);
  WiFi.begin(STASSID, STAPSK);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(500);
  }
  Serial.println();
  Serial.print("Connected! IP address: ");
  Serial.println(WiFi.localIP());
  Serial.printf("UDP server on port %d\n", localPort);
  Udp.begin(localPort);
}

void loop() {
  if (millis() - intervallSendezeit > 10) {
    analogWert = analogRead(analogPin);
    intervallSendezeit = millis();
    Udp.beginPacket(address, serverPort);  //IP und Port des gerufenen Servers
    Udp.print("analogWert ");
    Udp.println(analogWert);
    Udp.endPacket();
  }
  // if there's data available, read a packet
  int packetSize = Udp.parsePacket();
  if (packetSize) {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Udp.read(ankoBytes, 700);
    Serial.println("ankoBytes1");
    int i = 0;
    for (i = 0; i < (packetSize + 2); i++) {
      Serial.print(ankoBytes[i]);
    }
  }
}

Das ganze läuft zusätzlich zu dem Webserver den ich auf dem ESP mit OTA.
Das ganze kann man sicher auch zum Datenaustausch zwischen 2 oder auch mehreren? ESP benutzen (funktioniert auch über Internet) .
Nachdem hier oft über Datenübertragung über grössere Entfernungen nachgefragt wird hilft es ja evtl jemaden.
Natürlich sind Verbesserungen oder sonstige Anregungen willkommen.

Prima, das ist eine weitere mögliche Variante zum Debuggen, wenn man vor allem den Plotter nutzen will. Wenn es nur um Textausgaben geht, kann man auch über Websockets zum Browser oder über Telnet zu Putty debuggen.

Gruß Tommy

Danke auch von mir dafür.
Ich hoffe, das sind nicht deine originalen Daten zu Fritzbox, sonst bitte löschen.

Danke, ich hatte das ja gelöscht dann ist vor dem hochladen alles abgestürzt und dann hab ichs vergessn...

es muss nur das serial.println gegen das udp.println getauscht werden.

weil ichs grad ähnlich in einem Sketch habe, nutze dafür doch einfach eine Referenz auf deine Schnittstelle, und schalte einfach mit einem #define um

nur so als Idee

#define USE_SERIAL 0                             // 0 .. 4 Serial, set to -1 to use Software Serial

#if USE_SERIAL == 0
HardwareSerial &mySerial = Serial;               // Reference to HW Serial (good for debugging of messages)
#elif USE_SERIAL == 1
HardwareSerial &mySerial = Serial1;              // Reference to HW Serial1 (for example if you are using an MEGA)
#elif USE_SERIAL == 2
HardwareSerial &mySerial = Serial2;
#elif USE_SERIAL == 3
HardwareSerial &mySerial = Serial3;
#else
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX         from HW Serial!
#endif

ich glaub du schaffst ein -2 :wink:

Oder ohne define-Orgien: Eine Referenz auf Stream oder Print, der man dann udp oder die seriellen oder lcd oder alles andere, was davon erbt, zuweisen kann.

Gruß Tommy

Hallo und Danke für die Anregungen, da muss ich mich erstmal damit befassen, aber kann das funktionieren? Weill das beginpacked und endpacked brauche ich ja auch.

Gruß Sepp

Du hast Recht.

Gruß Tommy

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