Hallo ich habe ein problem nämlich ich möchte eine led per UDP steuern und ich habe auch ein code aber wenn ich per udp mein befehl schicke passiert nichts
Der behfehl sieht volgendermaßen aus:
echo "0" > /dev/udp/192.168.178.12/4210
und der der code für den ESP sieht so aus:
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
const char* ssid = "****";
const char* password = "*****";
WiFiUDP Udp;
unsigned int localUdpPort = 4210; // local port to listen on
char incomingPacket[255]; // buffer for incoming packets
char replyPacket[] = "Hi there! Got the message :-)"; // a reply string to send back
int Packet = 100;
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println(" connected");
Udp.begin(localUdpPort);
Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
pinMode(D0, OUTPUT);
digitalWrite(D0, HIGH);
}
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;
}
if (incomingPacket[255] == 1){
digitalWrite(D0, LOW);
Serial.printf("UDP packet contents: %s\n", incomingPacket);
}
if(incomingPacket[255] == 0){
digitalWrite(D0, HIGH);
Serial.printf("UDP packet contents: %s\n", incomingPacket);
Serial.print(Packet);
// send back a reply, to the IP address and port we got the packet from
Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.write(replyPacket);
Udp.endPacket();
}
}/code]
und die befehle kommen ja an die werden mir seriel auch ausgegeben.
Vielendank für eure Hilfe :)
if (incomingPacket[255] == 1){
Du versuchst Char mit Integer zu vergleichen.
Gruß Fips
Dein Paket ist zwei Zeichen lang, die '0' und '\0'.
Warum Du dann das 256.Zeichen mit 1 vergleichst, ist unklar.
Gruß Tommy
wie kann ich den ein char mit ein int vergelichen ?
ProgNiklas:
wie kann ich den ein char mit ein int vergelichen ?
zB.:
int Schaltzustand = atoi(incomingPacket);
if (Schaltzustand == 1) {
Gruß Fips
char incomingPacket[255]; // buffer for incoming packets
...
int len = Udp.read(incomingPacket, 255);
if (len > 0)
{
incomingPacket[len] = 0;
}
if (incomingPacket[255] == 1){
....
Dein read liest bis zu 255 Zeichen (aber vermutlich weniger) und liefert dir die aktuelle Länge zurück.
Das verwendest du, um die empfangenen Zeichen in einen Text mit Endekennung zu wandeln.
Soweit so schön.
incomingPacket[255]
gibt es übrigens nicht, das ist in Wirklichkeit eine andere Variable. Du greifst ausserhalb des definierten Bereichs ( 0 .. 254 )
Falls UDP genug Daten liefert ( 255 ), schreibst du die Endekennung an die falsche Stelle.
Wasif (incomingPacket[255] == 1)
liefert, ist völlig ungewiss.
@Fips: Natürlich kann man einchar
mit 1 vergleichen. Ob man es besser mit dem Buchstaben '1' vergleichen sollte, ist natürlich eine andere Frage.
Wenn du einen Text aus mehreren Buchstaben, wie z.B. "123" mit der Zahl 123 vergleichen willst, ist die Funktion atoi evtl. sinnvoll. Wenn du einen einzelnen Buchstaben vergleichen willst, ist
if (incomingByte[0] == '1' )
der Vergleich deiner Wahl.
Danke es geht aber wenn ich jetzt eh dabei bin wie kann ich das machen das ich z.b. an schreibe und es dann An geht weil ich ja An nicht in einen int schreiben kann
Du kannst "An" und "Aus" mit strcmp vergleichen (Zeichenketten in C).
Du kannst natürlich auch 0 für aus und 1 für an übertragen.
Vor allem musst Du Dir vorher Gedanken machen, wie Deine Übertragung aussehen soll, damit Du weißt was an welcher Stelle erwartet werden kann.
Das mennt man dann ein Übertragungsprotokoll entwerfen.
Gruß Tommy
Ja das alles ist jetzt erstaml nur test weiße um ein Protukoll mache ich mir gedenken wenn ich weiß wie es später sein soll bzw in welchen dimensionen jetzt ist das erstmal nur um zu wißen wie das im groben überhaupt geht deshalp danke an alle die mir eine antwort gegeben haben
michael_x:
@Fips: Natürlich kann man einchar
mit 1 vergleichen. Ob man es besser mit dem Buchstaben '1' vergleichen sollte, ist natürlich eine andere Frage.
Es will mir gerade nicht gelingen einen char string mit 1 zu vergleichen.
char zahl[9] = "1";
if (zahl[0] == '1'){
Serial.println("geht");
}
char zahl[9] = "1";
if (zahl[0] == 1){
Serial.println("geht nicht");
}
Kannst du mir das bitte zeigen, oder habe ich dich falsch verstanden?
Gruß Fips
char zahl[9] = "1";
if (!strcmp(zahl,"1"){
Serial.println("gleich");
}
else {
Serial.println("ungleich");
}
Oder hast Du etwas anderes gemeint?
Gruß Tommy
Tommy56:
Oder hast Du etwas anderes gemeint?
Gruß Tommy
ich meinte es so wie vom TO geschrieben.
if (incomingPacket[255] == 1){
michael_x schrieb:
"Natürlich kann man ein char mit 1 vergleichen."
Das es mit "1" geht ist mir klar.
Gruß Fips
Etwas hatte es mich auch gewundert.
Michael_x hat aber auch nicht geschrieben, dass da Gleichheit als Ergebnis raus kommt. Nur, dass man vergleichen kann.
Gruß Tommy
Das es mit "1" geht ist mir klar.
Nur mal zur Klarstellung "1" , '1' und 1 sind drei verschiedene Sachen
char test[] = "1"; // das sind zwei char: ein '1' und ein Endezeichen (0)
if (test[0] == '1') Serial.println("klar");
if (test[0] == 49) Serial.println(" so so ! ( '0' ist 48 oder 0x30 , 'A' ist 65 oder 0x41 ) ");
if (test[0] == ('0' + 1) ) Serial.println(" Mit char kann man auch rechnen! ");
// if (test[0] != "1") {} // Das meckert der Compiler zurecht an. Leider nur als Warnung
warning: comparison with string literal results in unspecified behaviour [-Waddress]
michael_x:
Nur mal zur Klarstellung "1" , '1' und 1 sind drei verschiedene Sachen
char test[] = "1"; // das sind zwei char: ein '1' und ein Endezeichen (0)
Das ist mir bekannt.
char zahl[9] = "1";
if (zahl[0] == 49){
Serial.println("geht");
}
ASCII
Jetzt wo du es schreibst erninnere ich mich, es schon mal gelesen zu haben.
Gruß und Danke für die Auffrischung!