Go Down

Topic: Função, enviar ou receber parâmetro/dados. (Read 5236 times) previous topic - next topic

José Antônio

No código abaixo, preciso chamar a função Ler passando um parâmetro ou dela receber o que foi digitado, não estou a conseguir fazer nenhuma coisa alguma. A necessidade é para poder gravar o que foi digitado em variáveis.
Code: [Select]
char entrada[15];   
byte etapa;
void setup() {
  Serial.begin(9600);   
  etapa = 1;
}
int Ler(){
  if (Serial.available() >= 15) {
    for ( int i = 0; i < 15; i++)
      entrada[i] = Serial.read();
    Serial.print("Recebido: ");
    for ( int u = 0; u < 15; u++)
      Serial.print(entrada[u]);
    Serial.println();
    return 1; 
  }
}
void loop() {
  if (etapa == 1){
    Serial.println("Entre com o endereco IP.");
    Serial.println("Atencao: Use o formato xxx.xxx.xxx.xxx");
    while (Ler() != 1){
    };
    etapa = 2;
  }
  if (etapa == 2){
    Serial.println("Entre com o mascara.");
    Serial.println("Atencao: Use o formato xxx.xxx.xxx.xxx");
    while (Ler() != 1){
    };
    etapa = 3;
  }
  if (etapa == 3){
    Serial.println("Entre com o gateway.");
    Serial.println("Atencao: Use o formato xxx.xxx.xxx.xxx");
    while (Ler() != 1){
    };
    etapa = 4;
  }
}

Filantropic

if (Serial.available() >= 15){
   .....
   return 1
{

e se não for, retorna o que?

Tente colocar um else no final e nos diga s emudou algo.

Code: [Select]
int Ler(){
  if (Serial.available() >= 15) {
    for ( int i = 0; i < 15; i++)
      entrada[i] = Serial.read();
    Serial.print("Recebido: ");
    for ( int u = 0; u < 15; u++)
      Serial.print(entrada[u]);
    Serial.println();
    return 1; 
  }
  else{
     return 0;
  }
}


Abraços

José Antônio

Esta parte funciona, porém preciso chamar a função Ler passando um valor, assim:
1 quando o valor a ser capturado é o IP;
2 para máscara;
3 para gateway.
Pois assim farei a gravação do valor capturado dentro a função Ler.
Pelo que sei basta colocar o valor entre os parênteses da chamada da função,  tendo declarado a variável receptora na função, mas dá erro!
Code: [Select]
char entrada[15];   
boolean inicio;
byte etapa;
int retorno;
void setup() {
  Serial.begin(9600);   
  inicio = true;
  etapa = 1;
  retorno = 0;
}
int Ler(int x){
  if (Serial.available() >= 15) {
    for ( int i = 0; i < 15; i++)
      entrada[i] = Serial.read();
    Serial.print("Recebido: ");
    for ( int u = 0; u < 15; u++)
      Serial.print(entrada[u]);
    Serial.println();
    return 1;
  }
  else
    return 0;
}

void loop() {
  if (etapa == 1){
    Serial.println("Entre com o endereco IP. No formato xxx.xxx.xxx.xxx");
    Serial.println("Atencao: Use o formato xxx.xxx.xxx.xxx");
    while (Ler(1) != 1){
    };
    etapa = 2;
  }
  if (etapa == 2){
    Serial.println("Entre com o mascara. No formato xxx.xxx.xxx.xxx");
    Serial.println("Atencao: Use o formato xxx.xxx.xxx.xxx");
    while (Ler() != 1){
    };
    etapa = 3;
  }
  if (etapa == 3){
    Serial.println("Entre com o gateway. No formato xxx.xxx.xxx.xxx");
    Serial.println("Atencao: Use o formato xxx.xxx.xxx.xxx");
    while (Ler() != 1){
    };
    etapa = 4;
  }
}


Obrigado!

HugoPT

#3
Nov 14, 2013, 10:22 am Last Edit: Nov 14, 2013, 10:33 am by HugoPT Reason: 1
O erro dá porque a tua funçao aceita um parametro e tu estas a chama-a depois sem passares o parametro int x quando a chamas na loop.Em todo o caso mesmo que passes o parametro na tua funçao ler nao o estas a usar, entao para quê passa-lo?

Code: [Select]
char ip[15];
char netmask[15];
char gateway[15];

void setup()
{
Serial.begin(9600);   
}
void loop()
{
ler(1);//Isto ira ler o IP
ler(2);//Isto ira ler a mascara
ler(3);//Isto le o gateway
}


int ler(int x)
{
switch (x)
   {
    case '1':   
      readSerial(ip);
      break;
    case '2':   
      readSerial(netmask);
      break;
    case '3':   
      readSerial(gateway);
      break;
    default:
      Serial.println("Valor passado errado");
    }


void readSerial(char *myArray)
{
  while(Serial.available() <=14){}//O codigo ira travar aqui ate ter recebido os 14 bytes
  for(int i = 0; i < 15; i++)
    {
    myArray[i] = Serial.read();
    }
  for ( int u = 0; u < 15; u++)
    Serial.print(myArray[u]);
}

Nao testei o codigo porque nao tenho o meu menino por perto, mas deve te dar uma idea de como podes fazer ...

Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

José Antônio

O código funcionou, tive só que remover os apóstrofos na instrução case. Obrigado!
Por ora estou a tentar fazer o ciclo recomeçar quando o usuário não confirmar a operação, porém a condição na linha if (Serial.read() == 78 or Serial.read() == 110)
não é atendida quando digito n ou N, tem ideia onde está o erro?
Code: [Select]
char ip[15];
char netmask[15];
char gateway[15];
boolean inicio;

void setup()
{
  Serial.begin(9600);
  inicio = true;
}
void loop()
{
  while (inicio == true){
    ler(1);
    ler(2);
    ler(3);
    inicio = false;
    Serial.println("IP:");
    for (int u = 0; u < 15; u++)
      Serial.print(ip[u]);
    Serial.println();
    Serial.println("Mascara:");
    for (int u = 0; u < 15; u++)
      Serial.print(netmask[u]);
    Serial.println();
    Serial.println("Gateway:");
    for (int u = 0; u < 15; u++) 
      Serial.print(gateway[u]);
    Serial.println();
    Serial.println("Confirma? S ou N");
    while(Serial.available() < 1){
    }
    Serial.print(Serial.read());
    if (Serial.read() == 78 or Serial.read() == 110)
      inicio = true;// Por que não assume?   
  }
}

int ler(int x)
{
  switch (x)
  {
  case 1:   
    readSerial(1);
    break;
  case 2:   
    readSerial(2);
    break;
  case 3:   
    readSerial(3);
    break;
  default:
    Serial.println("Valor passado errado");
  }


void readSerial(int y)
{
  if (y == 1)
    Serial.println("Entre com o IP");
  if (y == 2)
    Serial.println("Entre com a Mascara");
  if (y == 3)
    Serial.println("Entre com o Gateway");
  while(Serial.available() <=14){
  }
  for(int i = 0; i < 15; i++)
  {
    if (y == 1)
      ip[i] = Serial.read();
    if (y == 2)
      netmask[i] = Serial.read();
    if (y == 3)
      gateway[i] = Serial.read();
  }
}

HugoPT

#5
Nov 17, 2013, 12:14 am Last Edit: Nov 17, 2013, 12:24 am by HugoPT Reason: 1
Quote
O código funcionou, tive só que remover os apóstrofos na instrução case. Obrigado!

Quando digitas um caracter na serial port este ocupa um byte por cada caracter digitado.Como eu à pressa meti na funcao int ler(int x) entao o valor passado por x esta a ser tratado como um int.O correcto sera passa-lo como um char
Code: [Select]

int ler(char x)


Com isto ja podes usar as plicas tipo case '1'

Quote
Por ora estou a tentar fazer o ciclo recomeçar quando o usuário não confirmar a operação, porém a condição na linha if (Serial.read() == 78 or Serial.read() == 110)
não é atendida quando digito n ou N, tem ideia onde está o erro?

Sim
E simples:
Quote

Serial.println("Confirma? S ou N");
   while(Serial.available() < 1){//Aqui travas o codigo ate receberes um caracter-ok esperas pelo N ou pelo n
   }
   Serial.print(Serial.read());//Quando chegas aqui é porque alguem ja digitou o N ou o n e imprimes isso na serie e LIMPAS O BUFFER
   if (Serial.read() == 78 || Serial.read() == 110)//Logo quando tentas ler aqui ja nao tens nada no buffer !
     inicio = true;// Por que não assume?  Logo aqui nada é feito

O teu erro é estares a tentar ler algo que ja leste e descartas-te!
Sempre que les a porta serie esse byte é retirado do buffer automaticamente.(quando usas o serial.read() estas a ler e a retira-lo do buffer)
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

Go Up