TCP Verbindung wieder automatisch Starten

Hallo

ich baue mir dem Arduino eine TCP Verbindung auf. Wenn ich die verbindung an der gegenstelle beende und wieder Starte muss ich erst das Arduino neu Starten damit die Verbindung wieder aufgebaut wirde. Wie kann ich eine Verbindung aufbauen wenn die gegenstelle wieder voranden ist.

 // listen for incoming clients
    YunClient client = server.accept(); 
    // LED aus wenn Client nicht verbunden
    digitalWrite(13, LOW); 
    
    //Verbindungsaufbaue wenn Client verfügbar
    if (client.connect(PLC,PORT)){
        Console.println("connected");    
          while (client.connected()) {
             //LED an wenn Connected
               digitalWrite(13, HIGH);
                   
            }  
    
      }  
        
      
      delay(1);
      // close the connection:
      client.stop();
      client.flush();
    
    }
  }

Erstens: Poste den vollständigen Code, wir wollen nicht raten müssen, was ausserhalb des geposteten Stücks passiert.

Zweitens: server.accept() sollte bereits eine komplette Verbindung zurückliefern, was soll also das client.connect() danach? Falls das so gewollt ist, solltest Du unbedingt beschreiben, was Dein Code überhaupt machen soll, denn aus diesem minimalen Ausschnitt wird das definitiv nicht klar. Die while-Schlaufe scheint auch überflüssig, aber wie gesagt, ohne mehr zu wissen, ist das reine Spekulation.

Hallo
Ich baue eine TCP Verbindung zu einer SPS auf und sende Temperatur und Feuchte alle 2,5 sec. Wenn ich mit meiner IR Fernbedienung eine Tatser drücke wird der Befehl Rollo auf oder Rollo zu zur SPS gesendent.
Programm funktioniert soweit. Wenn aber abendes mein WLAN aus geht und morgens wieder an muss ich erst das Arduino neu Starten damit die TCP Verbindung wieder aufgebaut wird.

  #include <SPI.h>
  #include <Wire.h> 
  #include <Bridge.h>
  #include <YunServer.h>
  #include <YunClient.h>
  #include <Console.h>
  #include <DHT22.h>
  #include "IRremote.h"
  
  // SPS Port und IP 
  #define PORT 2500
  IPAddress PLC(192,168,178,30); // PLC Address
  YunServer server(PORT);
  
  // Temperatursensor PIN
  #define DHT22_PIN 4
  DHT22 myDHT22(DHT22_PIN);
  
  // Zeitlicher Funktionsaufruf
  long previousMillis = 0; 
  long interval = 2500; 
  unsigned long currentMillis;
  
  
  // IR Empfenger
  int receiver = 3;
  IRrecv irrecv(receiver);           // create instance of 'irrecv'
  decode_results results; 
  
  
   void setup() {
    
    irrecv.enableIRIn(); // Start the receiver
    Bridge.begin();      // Sarte Bridge
    digitalWrite(13, HIGH);
    Console.begin();     // Starte Console
     server.begin();     // Starte Server
    // while (!Console); // warte bis Console run
    delay(1000);
     
     
   }
   
   //******************************************************************Hautprogramm********************************************************
   void loop()
   {
    // listen for incoming clients
    YunClient client = server.accept(); 
    // LED aus wenn Client nicht verbunden
    digitalWrite(13, LOW); 
    
    //Verbindungsaufbaue wenn Client verfügbar
    if (client.connect(PLC,PORT)){
        Console.println("connected");    
      while (client.connected()) {
        //LED an wenn Connected
        digitalWrite(13, HIGH);
        
        // Zeit für Zeitliche aufruf              
         unsigned long currentMillis = millis();
         
        //  Temperaturwerte alle 2,5sec senden
         if(currentMillis - previousMillis > interval) {
            previousMillis = currentMillis; 
            TempFeuchte (client);  
         }
            
          if (irrecv.decode(&results)) {// have we received an IR signal?
             translateIR(client); 
             irrecv.resume(); // receive the next value
            }  
    
      }  
        
      
      delay(1);
      // close the connection:
      client.stop();
      client.flush();
    
    }
     }
   
  //***********************************************
  //**     Funktion Temperatur Feuchtw           **
  //***********************************************
   
   // Temperatur und Feuchte abfragen und senden
   void TempFeuchte (YunClient client) {
   
   DHT22_ERROR_t errorCode;  
   errorCode = myDHT22.readData();  
   int value;
   String cString;
   
   switch(errorCode) 
   { 
    case DHT_ERROR_NONE:  
    value = myDHT22.getTemperatureC()*100;
    
   // Value nur senden wenn nicht 0
        if (value != 0) { 
           cString ="GV/01"+String(value,DEC);
           client.write((uint8_t*)&cString[0], cString.length());
           Console.println(cString);
         }
   
    value = myDHT22.getHumidity()*100; 
        // Value nur senden wenn nicht 0
        if (value > 0) {
           cString ="GV/02"+String(value,DEC);
           client.write((uint8_t*)&cString[0], cString.length());
           Console.println(cString);
           }
    break;
    }
   }
   
   //***********************************************
  //**     Funktion IR Empfänger                 **
  //***********************************************
  void translateIR(YunClient client) {
    String cString;
    int i;
    
    switch(results.value)
    
    {
  
    case 0x2A0:  
      Console.println("Rollo AUF");
      i=1;
      break;
  
    case 0x2A1:  
      Console.println("Rollo ZU"); 
      i=2;
      break;
  
    case 0xAA1:  
      Console.println("Rollo ZU"); 
      i=2;
      break;
  
    case 0xAA0:  
      Console.println("Rollo AUF"); 
      i=1;
      break;
    
    
    default:
      i=0; 
      //Console.println(" other button   ");
  
    }
    if(i>0) {
      Console.println(i);
      cString ="IR/"+String(i,DEC)+"/1";
      client.write((uint8_t*)&cString[0], cString.length());
      Console.println(cString);  
      delay(1000);
      cString ="IR/"+String(i,DEC)+"/0";
      client.write((uint8_t*)&cString[0], cString.length());
      Console.println(cString); 
      i=0;
    }
    
    }

Wozu brauchst Du dann einen Server auf dem Yun?

Wieso geht abends Dein WLAN aus? Sind die Frequenzen bei Dir so stark belegt?

Das Problem dürfte in diesem Fall auf der Linux-Seite sein, Du müsstest dort dafür sorgen, dass die WLAN-Connectivity wieder hergestellt wird. Ich hätte eigentlich erwartet, dass das automatisch passiert, aber habe das noch nie getestet. Wie lange wartest Du denn jeweils nach dem "Starten" des WLANs bis Du das erste Kommando per Fernbedienung schickst?

Hallo
das WLAN wir ja vom der Linux Seite aufgebaut. Ich erreiche das Arduino Yun ja, nur das Arduino Programm baut keine Verbindung auf. erst nach Neustart

"Wozu brauchst Du dann einen Server auf dem Yun?"
weiß nicht habe das so von einem anderen Projekt übernommen. Kann ich das herauswerfen?

Was hat das mit der Fernbedienung zu tun? Die Temeperaturwerte werden doch kontinuierlich gesendet

Weiß jamand wie ich diese Problem lösen kann ?

Also nimm mal das server.accept() raus, auch die YunServer-Zeile, das ist Blödsinn, wenn Du keinen Server auf dem Yun haben willst.

Dann entferne die while(client.connected())-Schlaufe, damit für jeden Wert eine neue Verbindung aufgebaut wird.

Kriegst Du im Normalbetrieb dann mehr als einen Messwert auf die SPS?

Hallo
ich erhalte jeden Messert einseln. Diesen Verarbeite ich auf der SPS.

OK versuche es mal.

Hallo
versuche jetzt mal diesen Code. Wie könnte ich es machen das nur eine Verbindung aufgebaut wird wenn ich auch was zu senden habe ? Jetzt baue ich jede sec eine Verbindung auf.

  #include <SPI.h>
  #include <Wire.h> 
  #include <Bridge.h>
 // #include <YunServer.h>
  #include <YunClient.h>
  #include <Console.h>
  #include <DHT22.h>
  #include "IRremote.h"
  
  // SPS Port und IP 
  #define PORT 2500
  IPAddress PLC(192,168,178,30); // PLC Address
 // YunClient server(PORT);
  
  // Temperatursensor PIN
  #define DHT22_PIN 4
  DHT22 myDHT22(DHT22_PIN);
  
  // Zeitlicher Funktionsaufruf
  long previousMillis = 0; 
  long interval = 2500; 
  unsigned long currentMillis;
  
  
  // IR Empfenger
  int receiver = 3;
  IRrecv irrecv(receiver);           // create instance of 'irrecv'
  decode_results results; 
  
  
   void setup() {
    
    irrecv.enableIRIn(); // Start the receiver
    Bridge.begin();      // Sarte Bridge
    digitalWrite(13, HIGH);
    Console.begin();     // Starte Console
   //  server.begin();     // Starte Server
    // while (!Console); // warte bis Console run
    delay(1000);
     
     
   }
   
   //******************************************************************Hautprogramm********************************************************
   void loop()
   {
    // listen for incoming clients
    YunClient client;// = server.accept(); 
    // LED aus wenn Client nicht verbunden
    digitalWrite(13, LOW); 
    
    //Verbindungsaufbaue wenn Client verfügbar
    if (client.connect(PLC,PORT)){
        Console.println("connected");    
      if (client.connected()) {
        //LED an wenn Connected
        digitalWrite(13, HIGH);
        
        // Zeit für Zeitliche aufruf              
         unsigned long currentMillis = millis();
         
        //  Temperaturwerte alle 2,5sec senden
         if(currentMillis - previousMillis > interval) {
            previousMillis = currentMillis; 
            TempFeuchte (client);  
         }
            
          if (irrecv.decode(&results)) {// have we received an IR signal?
             translateIR(client); 
             irrecv.resume(); // receive the next value
            }  
    
      }  
        
      
      delay(1000);
      // close the connection:
      client.stop();
      client.flush();
      Console.println("DISconnected");
    }
     }
   
  //***********************************************
  //**     Funktion Temperatur Feuchtw           **
  //***********************************************
   
   // Temperatur und Feuchte abfragen und senden
   void TempFeuchte (YunClient client) {
   
   DHT22_ERROR_t errorCode;  
   errorCode = myDHT22.readData();  
   int value;
   String cString;
   
   switch(errorCode) 
   { 
    case DHT_ERROR_NONE:  
    value = myDHT22.getTemperatureC()*100;
    
   // Value nur senden wenn nicht 0
        if (value != 0) { 
           cString ="GV/01"+String(value,DEC);
           client.write((uint8_t*)&cString[0], cString.length());
           Console.println(cString);
         }
   
    value = myDHT22.getHumidity()*100; 
        // Value nur senden wenn nicht 0
        if (value > 0) {
           cString ="GV/02"+String(value,DEC);
           client.write((uint8_t*)&cString[0], cString.length());
           Console.println(cString);
           }
    break;
    }
   }
   
   //***********************************************
  //**     Funktion IR Empfänger                 **
  //***********************************************
  void translateIR(YunClient client) {
    String cString;
    int i;
    
    switch(results.value)
    
    {
  
    case 0x2A0:  
      Console.println("Rollo AUF");
      i=1;
      break;
  
    case 0x2A1:  
      Console.println("Rollo ZU"); 
      i=2;
      break;
  
    case 0xAA1:  
      Console.println("Rollo ZU"); 
      i=2;
      break;
  
    case 0xAA0:  
      Console.println("Rollo AUF"); 
      i=1;
      break;
    
    
    default:
      i=0; 
      //Console.println(" other button   ");
  
    }
    if(i>0) {
      Console.println(i);
      cString ="IR/"+String(i,DEC)+"/1";
      client.write((uint8_t*)&cString[0], cString.length());
      Console.println(cString);  
      delay(1000);
      cString ="IR/"+String(i,DEC)+"/0";
      client.write((uint8_t*)&cString[0], cString.length());
      Console.println(cString); 
      i=0;
    }
    
    }

Wenn Du die IF-Anweisung

if(currentMillis - previousMillis > interval) {

ausserhalb der client.connect()-Anweisung anbringst, wird nur noch im von Dir gewünschten Interval eine Verbindung aufgebaut.

Hallo
habe es so versucht. Allerdings heute Morgen dasselbe keine Verbindung nach WLan ein. Wenn das Wlan kurz aus ist funktioniert der erneute Verbindungsaufbau. Wenn das WLAN über Nacht aus ist schalet wohl was auf der Linux Seite ab. Gibt es jemanden der sich hiermit auskennt?

  #include <SPI.h>
  #include <Wire.h> 
  #include <Bridge.h>
 // #include <YunServer.h>
  #include <YunClient.h>
  #include <Console.h>
  #include <DHT22.h>
  #include "IRremote.h"
  
  // SPS Port und IP 
  #define PORT 2500
  IPAddress PLC(192,168,178,30); // PLC Address
  bool _Connected;
 // YunClient server(PORT);
  
  // Temperatursensor PIN
  #define DHT22_PIN 4
  DHT22 myDHT22(DHT22_PIN);
  
  // Zeitlicher Funktionsaufruf
  long previousMillis = 0; 
  long interval = 9000; 
  unsigned long currentMillis;
  
  
  // IR Empfenger
  int receiver = 3;
  IRrecv irrecv(receiver);           // create instance of 'irrecv'
  decode_results results; 
  
  
   void setup() {
    
    irrecv.enableIRIn(); // Start the receiver
    Bridge.begin();      // Sarte Bridge
    digitalWrite(13, HIGH);
    Console.begin();     // Starte Console
   //  server.begin();     // Starte Server
    // while (!Console); // warte bis Console run
    delay(1000);
     
    YunClient client;// = server.accept(); 
   }
   
   //******************************************************************Hautprogramm********************************************************
   void loop()
   {
    // listen for incoming clients
    YunClient client;// = server.accept(); 
    // LED aus wenn Client nicht verbunden
      
    // Zeit für Zeitliche aufruf              
    unsigned long currentMillis = millis();
         
    //  Temperaturwerte alle 2,5sec senden
    if(currentMillis - previousMillis > interval) {
       previousMillis = currentMillis; 
        if (client.connect(PLC,PORT)){
          Console.println("connected");
          digitalWrite(13, HIGH);
         if (client.connected()) {
             TempFeuchte (client);
             TCPDisConnect(client);
          }
        }
       }     
    if (irrecv.decode(&results)) {// have we received an IR signal?
      //  translateIR(client); 
        irrecv.resume(); // receive the next value
        }  
    
      delay(100);
         
  }
   
   
  //***********************************************
  //**     Funktion TCP Verbindung              **
  //***********************************************
   
   // TCP Verbindung
   void TCPConnect (YunClient client) { 
         
   
   }
   
  //***********************************************
  //**     Funktion TCP Verbindung              **
  //***********************************************

  void TCPDisConnect (YunClient client) { 
       client.stop();
       client.flush(); 
      _Connected = LOW ;
      digitalWrite(13, LOW);
      Console.println("Disconnected"); 
  }
   
  //***********************************************
  //**     Funktion Temperatur Feuchtw           **
  //***********************************************
   
   // Temperatur und Feuchte abfragen und senden
   void TempFeuchte (YunClient client) {
   
   DHT22_ERROR_t errorCode;  
   errorCode = myDHT22.readData();  
   int value;
   String cString;
   
   // TCP Verbindungsaufbau
   
   
   
   
     switch(errorCode) 
     { 
      case DHT_ERROR_NONE:  
      value = myDHT22.getTemperatureC()*100;
       
   // Value nur senden wenn nicht 0
        if (value != 0) { 
           cString ="GV/01"+String(value,DEC);
           client.write((uint8_t*)&cString[0], cString.length());
           Console.println(cString);
         }
   
     value = myDHT22.getHumidity()*100; 
        // Value nur senden wenn nicht 0
        if (value > 0) {
           cString ="GV/02"+String(value,DEC);
           client.write((uint8_t*)&cString[0], cString.length());
           Console.println(cString);
           }
         
     break;
     }
     
        
   }
   //***********************************************
  //**     Funktion IR Empfänger                 **
  //***********************************************
  void translateIR(YunClient client) {
    String cString;
    int i;
    
       
    switch(results.value)
    
    {
  
    case 0x2A0:  
      Console.println("Rollo AUF");
      i=1;
      break;
  
    case 0x2A1:  
      Console.println("Rollo ZU"); 
      i=2;
      break;
  
    case 0xAA1:  
      Console.println("Rollo ZU"); 
      i=2;
      break;
  
    case 0xAA0:  
      Console.println("Rollo AUF"); 
      i=1;
      break;
    
    
    default:
      i=0; 
      //Console.println(" other button   ");
  
    }
    if(i>0) {
     
     
          Console.println(i);
          cString ="IR/"+String(i,DEC)+"/1";
          client.write((uint8_t*)&cString[0], cString.length());
          Console.println(cString);  
          delay(1000);
          cString ="IR/"+String(i,DEC)+"/0";
          client.write((uint8_t*)&cString[0], cString.length());
          Console.println(cString); 
          i=0;
          
      
    }
  }