Go Down

Topic: EthernetServer server pegar valor de outra variavél ? (Read 327 times) previous topic - next topic

wfranco

Preciso que a função EthernetServer server(80); pegue o valor de outra variavé,l esta variavél ja esta sendo lida no  SD card e passada para a variável int localPort; consigo printar ela na serial e tudo mais, porém ao tentar   EthernetServer server(localPort); não da certo, lembrando que IP e mascara já funcionam vindas do SD card apenas a porta não é passada para o server.

Alguém já passou por isso tem alguma ideia de porque não funciona ? J

FernandoGarcia

Olá!

Por acaso a variável "localPort" não é um array?

Você pode tentar isto:

Code: [Select]
EthernetServer server(atoi(localPort));

Abraço.
Conheça uma nova opção Open Source para controlar seu aquário: www.ferduino.com

wfranco

Na verdade o valor vem da seguinte forma:

byte myPort[0];

depois converto ele

unsigned int localPort = int(myPort[0]);

FernandoGarcia

Um array de tamanho 0?
É melhor postar o código inteiro.
Conheça uma nova opção Open Source para controlar seu aquário: www.ferduino.com

wfranco

Este código de pegar i ip/porta e mascara funciona perfeitamente em um outro projeto porém usa porta UDP, ou seja  o local porta é passado para a porta UDP e não para o EthernetServer server.


Resumi o código e no final tem o resultado do serial Monitor


//teste ler do cartão
byte myIP[4];//IP gravado no SD Card pega valor normalmente
byte myNM[4];//Mascara de rede gravada no SD Card pega valor normalmente
byte myPort[0];//Porta gravada no SD Card
unsigned int localPort = int(myPort[0]);//pega o valor gravado no indice

  • int porta = localPort;
    //teste ler do cartão


    // MAC address from Ethernet shield sticker under board
    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    //IPAddress ip(192, 168, 0, 136);  // IP address, may need to change depending on network
    EthernetServer server(1000);     // create a server at port 80
    //EthernetServer server(localPort);
    File webFile;                    // the web page file on the SD card
    char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
    char req_index = 0;              // index into HTTP_req buffer
    boolean LED_state[11] = {0};      // stores the states of the 8 LEDs



    void loop(){}




    void setup()
    {


      // disable Ethernet chip
      pinMode(53, OUTPUT);//pino sd card mega no uno é o 10
      digitalWrite(10, HIGH);
      Serial.begin(9600);     

      // initialize SD card
      Serial.println("Initializing SD card...");
      if (!SD.begin(4)) {
        Serial.println("ERROR - SD card initialization failed!");
        return;    // init failed
      }
      Serial.println("SUCCESS - SD card initialized.");
      // check for index.htm file
      if (!SD.exists("index.htm")) {
        Serial.println("ERROR - Can't find index.htm file!");
        return;  // can't find index file
      }
      Serial.println("SUCCESS - Found index.htm file.");
     
      //teste ler do cartão***************************************************************
      //teste ler do cartão***************************************************************
      //teste ler do cartão***************************************************************
      File fh = SD.open("network.txt",FILE_READ);
      char netBuffer[32];

      if(!fh)
      {
        Serial.println("SD open fail");
        return;   
      }

      int chPos = 0;
      int lineNo = 0;

      while(fh.available())
      {
        char ch = fh.read();
        if(ch == '\r') {
          chPos = 0;

          switch(lineNo) {

          case 0:
            // Serial.print("ip ");       
            sscanf(netBuffer,"%u.%u.%u.%u",&myIP[0],&myIP[1],&myIP[2],&myIP[3]); 
            break; 

          case 1:
            //Serial.print("netmask ");       
            sscanf(netBuffer,"%u.%u.%u.%u",&myNM[0],&myNM[1],&myNM[2],&myNM[3]); 
            break; 

          case 2:
            //Serial.print("Port ");       
            sscanf(netBuffer,"%u.%u.%u.%u",&myPort[0]); 
            break;
          }
          //Serial.println(netBuffer);
          lineNo++;
        }
        else if(ch == '\n') {
          // do nothing
        }
        else if(chPos < 31) {
          netBuffer[chPos] = ch;
          chPos++;
          netBuffer[chPos] = 0;
        }
      }
      fh.close();
      int x;

      Serial.print("\r\nip ");
      for(x=0;x<4;x++) {
        Serial.print(myIP
  • ,DEC);
        if(x<3) Serial.print(".");
      }
      Serial.print("\r\nnetmask ");
      for(x=0;x<4;x++) {
        Serial.print(myNM
  • ,DEC);
        if(x<3) Serial.print(".");
      }
    /*  Serial.print("\r\nPort ");
      for(x=0;x<4;x++) {
        Serial.print(myPort[1],DEC);
        if(x<3) Serial.print(".");
      }*/
      Serial.println("\r\nStarting ethernet");
      Ethernet.begin(mac,myIP,myNM,myPort);
      Serial.println(Ethernet.localIP());
      Serial.print("Local Port:");
      Serial.println(localPort);

      //teste ler do cartão***************************************************************
      //teste ler do cartão***************************************************************
      //teste ler do cartão***************************************************************

      DEBUG NO MONITOR SERIAL
     
    Initializing SD card...
    SUCCESS - SD card initialized.
    SUCCESS - Found index.htm file.

    ip 192.168.0.140
    netmask 255.255.255.0
    Starting ethernet
    192.168.0.140
    Local Port:7777
    GET /ajax_inputs&nocache=342140.20357467234 HTTP/1.1

FernandoGarcia

Edite seu post e use a tag  para inserção de código
Conheça uma nova opção Open Source para controlar seu aquário: www.ferduino.com

bubulindo

Hmmm...

Estás a experimentar com que porto? A variável byte só consegue guardar valores até 255... não é por "converteres" para int (informo-te que isso não faz nada) que passas a ter mais espaço.

Tens a certeza que aquele código que postaste funciona?

Eu vejo isto:

Code: [Select]


byte myPort[0];//Porta gravada no SD Card

//depois tens isto...
sscanf(netBuffer,"%u.%u.%u.%u",&myPort[0]);  //a formatação está mal...

//e mais abaixo...
  Serial.print(myPort[1],DEC);


E isto é bem patente no facto que tu configuraste o porto 1000... e imprimes que o porto usado é o 7777.

Como é que tens guardado os dados no ficheiro dentro do SD?

Não quererás algo assim:

Code: [Select]


unsigned int myPort;//Porto vai de 0 a 65535

//depois tens isto...
sscanf(netBuffer,"%u",&myPort);  //a formatação está mal...

//e mais abaixo...
  Serial.print(myPort,DEC);


?
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

wfranco

OK fiz a alteração mas mesmo assim o EthernetServer server não assume o valor lido no SD card IP e mascara de rede funcionam normalmente.

Aqui esta o resultado do serial Monitor

Initializing SD card...
SUCCESS - SD card initialized.
SUCCESS - Found index.htm file.

ip 192.168.0.136
netmask 255.255.255.0
myPort 7777
Starting ethernet



Code: [Select]
//teste ler do cartão
byte myIP[4];//IP gravado no SD Card
byte myNM[4];//Mascara de rede gravada no SD Card
unsigned int myPort;//Porto vai de 0 a 65535
//teste ler do cartão


// MAC address from Ethernet shield sticker under board
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//IPAddress ip(192, 168, 0, 136); // IP address, may need to change depending on network
EthernetServer server(myPort);    // create a server at port 80
File webFile;                     // the web page file on the SD card
char HTTP_req[REQ_BUF_SZ] = {0};  // buffered HTTP request stored as null terminated string
char req_index = 0;               // index into HTTP_req buffer
boolean LED_state[11] = {0};      // stores the states of the 8 LEDs


void setup()
{

  // disable Ethernet chip
  pinMode(53, OUTPUT);//pino sd card mega no uno é o 10
  digitalWrite(10, HIGH);
  Serial.begin(9600);     

  // initialize SD card
  Serial.println("Initializing SD card...");
  if (!SD.begin(4)) {
    Serial.println("ERROR - SD card initialization failed!");
    return;    // init failed
  }
  Serial.println("SUCCESS - SD card initialized.");
  // check for index.htm file
  if (!SD.exists("index.htm")) {
    Serial.println("ERROR - Can't find index.htm file!");
    return;  // can't find index file
  }
  Serial.println("SUCCESS - Found index.htm file.");

  //teste ler do cartão***************************************************************
  //teste ler do cartão***************************************************************
  //teste ler do cartão***************************************************************
  File fh = SD.open("network.txt",FILE_READ);
  char netBuffer[32];

  if(!fh)
  {
    Serial.println("SD open fail");
    return;   
  }

  int chPos = 0;
  int lineNo = 0;

  while(fh.available())
  {
    char ch = fh.read();
    if(ch == '\r') {
      chPos = 0;

      switch(lineNo) {

      case 0:
        // Serial.print("ip ");       
        sscanf(netBuffer,"%u.%u.%u.%u",&myIP[0],&myIP[1],&myIP[2],&myIP[3]); 
        break; 

      case 1:
        //Serial.print("netmask ");       
        sscanf(netBuffer,"%u.%u.%u.%u",&myNM[0],&myNM[1],&myNM[2],&myNM[3]); 
        break; 

      case 2:
        //Serial.print("Port ");       
        //sscanf(netBuffer,"%u.%u.%u.%u",&myPort[0]);
        sscanf(netBuffer,"%u",&myPort);  //a formatação está mal...   
        break;
      }
      //Serial.println(netBuffer);
      lineNo++;
    }
    else if(ch == '\n') {
      // do nothing
    }
    else if(chPos < 31) {
      netBuffer[chPos] = ch;
      chPos++;
      netBuffer[chPos] = 0;
    }
  }
  fh.close();
  int x;

  Serial.print("\r\nip ");
  for(x=0;x<4;x++) {
    Serial.print(myIP[x],DEC);
    if(x<3) Serial.print(".");
  }
  Serial.print("\r\nnetmask ");
  for(x=0;x<4;x++) {
    Serial.print(myNM[x],DEC);
    if(x<3) Serial.print(".");
  }
  Serial.print("\r\nmyPort ");
  Serial.print(myPort,DEC);
  /*  Serial.print("\r\nPort ");
   for(x=0;x<4;x++) {
   Serial.print(myPort[1],DEC);
   if(x<3) Serial.print(".");
   }*/
  Serial.println("\r\nStarting ethernet");
  Ethernet.begin(mac,myIP,myNM);
  //Serial.println(Ethernet.localIP());
  //Serial.print("Localport:");
  //Serial.println();
  //Serial.print("porta:");
  // Serial.println(porta);

  //Ethernet.begin(mac, ip);  // initialize Ethernet device
  server.begin();           // start to listen for clients


  //teste ler do cartão***************************************************************
  //teste ler do cartão***************************************************************
  //teste ler do cartão***************************************************************

FernandoGarcia

Como quer que o EthernetServer server assuma o valor lido se ele é inicalizado antes da leitura do cartão?

Code: [Select]

unsigned int myPort;//Porto vai de 0 a 65535
EthernetServer server(myPort);    // create a server at port 80
Conheça uma nova opção Open Source para controlar seu aquário: www.ferduino.com

wfranco

OK faz sentido, mas como fazer isso ? seguindo o sistema procedural do arduino ele vai ler o html no cartão depois o network.txt atribuir os valores as variaveis e depois executar o server.begin(); no final do bloco setup depois de percorrer todos os comandos.


FernandoGarcia

#10
Oct 01, 2014, 08:57 pm Last Edit: Oct 14, 2014, 10:51 pm by FernandoGarcia Reason: 1
Não sei se esta é a melhor forma mas, acho que funciona.

Dentro do setup coloque:

Code: [Select]

Ethernet.begin(mac,myIP,myNM);
EthernetServer server(myPort);
server.begin();


Desta forma ela ficará como variável local.

Depois vai ter que colocá-la novamente dentro da função que envia os dados.

Assim:

Code: [Select]

  EthernetServer server(myPort);
  EthernetClient client = server.available();
Conheça uma nova opção Open Source para controlar seu aquário: www.ferduino.com

wfranco

NA MOSCA!!!!  deu certo agora foi... enfim os erros eram:

Chamar uma variavél byte, tentar converter para uma variavél int segundo o post internacional que fiz não dá certo.
ERRADO:
Code: [Select]

byte myPort[0];//Porta gravada no SD Card
unsigned int localPort = int(myPort[0]);


CERTO:
Code: [Select]

unsigned int myPort;//



O Buffer estava errado também.
Errado:
Code: [Select]

Serial.print("Port ");       
sscanf(netBuffer,"%u.%u.%u.%u",&myPort[0]); 


Serial.print("\r\nPort ");
  for(x=0;x<4;x++) {
    Serial.print(myPort[1],DEC);
    if(x<3) Serial.print(".");
 


Certo:
Code: [Select]

sscanf(netBuffer,"%u",&myPort);

Serial.print("\r\nmyPort ");
  Serial.print(myPort,DEC);



Inicializar o EthernetServer antes de ler o paramento no sd card

bubulindo

É um prazer ajudar. Mete resolvido no titulo. :)
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Go Up