Go Down

Topic: Invio Comandi tra Client e Server (Read 2 times) previous topic - next topic

lesto

#15
Feb 18, 2013, 05:30 pm Last Edit: Feb 18, 2013, 05:32 pm by lesto Reason: 1
in che senso non credi che cambi ganchè? con comando[3] stai andando a leggere una zona di memoria al di fuori del tuo array (array overflow, se il sistema operativo, che arduino non ha, rileva una baggianata del genere ti uccide il programma con un errore di Segmentation Fault, uno degli errori più difficili da correggere individuare e più sensibili lato sicurezza!) , per quel che ne sai lì dentro potrebbe esserci la prima lettera della dichiarazione di indipendenza in giapponese  :D
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

lollo1100

Arduino Lato Client

Code: [Select]


#include <SPI.h>

#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>
#include <util.h>
#include <WebServer.h>

#define BUTTONON  7                 //  PIN7 INPUT = BUTTON 
#define BUTTONOFF 6                 //  PIN7 INPUT = BUTTON 

int ts1st  = HIGH;                  //  ts1st LEGGE E MEMORIZZA IL LIVELLO DI BUTTON 
int stato1 = HIGH;                  //  stato1 MANTIENE LO STATO DI BUTTON
int ts2st  = HIGH;                  //  ts2st LEGGE E MEMORIZZA IL LIVELLO DI BUTTON 
int stato2 = HIGH;                  //  stato2 MANTIENE LO STATO DI BUTTON
int i = 0;                          //  i CONTA LE VOLTE DI BUTTON ON PUSH
int j = 0;                          //  j CONTA LE VOLTE DI BUTTON OFF PUSH

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x47 };          //  MAC ETHERNET SHIELD
byte ip[] = { 10, 10, 11, 16 };                               //  IP CLIENT
byte server[] = { 10, 10, 11, 45 };                           //  IP SERVER
byte gateway[] = { 10, 10, 11, 1 };                           //  INDIRIZZO ROUTER GATEWAY
byte subnet[] = { 255, 255, 255, 0 };                         //  SUBNET

EthernetClient client;

void setup() { 

  Ethernet.begin(mac, ip, gateway, subnet);                 //  INIZIALIZZA ETHERNET
  Serial.begin(9600);                                       //  INIZIALIZZA LA SERIALE
  pinMode(BUTTONON, INPUT);                                 //  IMPOSTA IL BUTTONON COME INPUT
  pinMode(BUTTONOFF, INPUT);                                //  IMPOSTA IL BUTTONOFF COME INPUT
  delay(150);                                               //  RITARDO DI 150ms



void loop() { 

  ts1st = digitalRead(BUTTONON);                            //  LEGGE E MEMORIZZA IL VALORE DI BUTTONON
  ts2st = digitalRead(BUTTONOFF);                           //  LEGGE E MEMORIZZA IL VALORE DI BUTTONOFF

    if ( ts1st == HIGH && stato1 == HIGH );
  else{
    if ( ts1st == LOW && stato1 == HIGH ){                    //  PULSANTE PUSH FASE ON
      stato1 = LOW;                                           //  IMPOSTA IL NUOVO STATO = LOW
      delay(150);                                             //  RITARDO 150ms
      i++;                                                    //  INCREMENTA CONTEGGIO PUSH
      Serial.print(" IL BOTTONE ON E' STATO PREMUTO ");       //  STAMPA IL NUMERO DI PUSH EFFETTUATI
      Serial.print(i);
      Serial.print(" VOLTE");
      Serial.println();
      if (client.connect(server, 23)){
        client.print("ON ");     
        client.stop();
      }
      else{
        Serial.println("Connessione ON fallita");  //  Altrimenti
        //  Stampa su COM3 Connessione ON fallita
        client.stop();                 //  Chiudi connessione
      }
    }
    if ( ts1st == HIGH && stato1 == LOW )                   //  POSIZIONE DI RIPOSO FASE OFF
      stato1 = HIGH;                                        //  AGGIORNA IL NUOVO STATO DI BUTTONON = HIGH
  }

  if ( ts2st == HIGH && stato2 == HIGH );
  else{
    if ( ts2st == LOW && stato2 == HIGH ){                    //  PULSANTE PUSH FASE ON
      stato2 = LOW;                                           //  IMPOSTA IL NUOVO STATO = LOW
      delay(150);                                             //  RITARDO 150ms
      j++;                                                    //  INCREMENTA CONTEGGIO PUSH
      Serial.print(" IL BOTTONE OFF E' STATO PREMUTO ");      //  STAMPA IL NUMERO DI PUSH EFFETTUATI
      Serial.print(j);
      Serial.print(" VOLTE");
      Serial.println();
      if (client.connect(server, 23)){
        client.print("OFF");     
        client.stop();
      }
      else{
        Serial.println("Connessione OFF fallita");    //  Altrimenti
                                                     //  Stampa su COM3 Connessione ON fallita
        client.stop();                               //  Chiudi connessione
      }
    }
    if ( ts2st == HIGH && stato2 == LOW )                     //  POSIZIONE DI RIPOSO FASE OFF
      stato2 = HIGH;                                          //  AGGIORNA IL NUOVO STATO DI BUTTON = HIGH     
  }
}



Arduino Lato Server

Code: [Select]


#include <SPI.h>                               //  Importa Libreria SPI
#include <Ethernet.h>                          //  Importa Libreria
//  Ethernet

#define LED 7                                  //  Porta digitale 7 LED

char comando[3] ;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };        //  MAC Ethernet Shield del Server

byte ip[] = { 10, 10, 11, 17 };                             //  IP Arduino Server

EthernetServer server = EthernetServer(23);    //  Telnet porta 23
EthernetClient client = 0;                     //  Inizializza il Client

void setup()
{
  pinMode( LED, OUTPUT );                      //  Imposta LED OUTPUT
  Ethernet.begin(mac, ip);                     //  Inizializza Ethernet
  server.begin();
}
void loop()
{
  while ( client.connected() && server.available() >= 3 ) {                 //  Client-To-Serve                                                                                               
    char c = client.read();                                            //  Legge i Byte su Client
    comando[0] = c;
    c = client.read();                                            //  Legge i Byte su Client
    comando[1] = c;
    c = client.read();                                            //  Legge i Byte su Client
    comando[2] = c;
  }
  if ( comando[0] == 'O' && comando[1] == 'N' && comando[2] == ' ' )
    digitalWrite( LED, HIGH );
  if ( comando[0] == 'O' && comando[1] == 'F' && comando[2] == 'F' )
    digitalWrite( LED, LOW );
}



Si Lesto non volevo dire che avevo fatto una cosa azzeccata anzi una sciocchezza enorme ho fatto, ma continua a non accendermi il LED messo sul PIN 7 del mio arduino Server
Grazie

lesto

collegati via telent al server, e invia i comandi tu stesso (non serve premere invio, telnet invia i caratteri mentre li digiti, quindi se sbagli a digitare in realtà il tasto cancella non funziona, anche se SEMBRA farlo)
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

lollo1100

Lesto capisco cosa intendi, però questo problema che mi è stato assegnato è di fare una rete  in cui ci sono N Client ( N Arduino Uno ) e N server (altri N Arduino Uno ) ognuno ha un ip in pratica gli N client hanno connesse delle pulsantiere touch e vanno a comandare in maniera confusionaria (IP) gli altri server che hanno invece collegati dei Relay quindi i comandi glieli devo passare in questo modo altrimenti risulta complicato . Dovrebbe in soldoni premi un bottone sul lato client accendi una luce o lo scaldabagno di uno dei tanti server.

lesto

si ma per fare i test devi andare per gradi, prima fai funzionare il server con telnet, poi lo fai funzionare con il client.
Altrimenti impazzisci a cercare nel server un errore del client.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up