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.
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;
}
}
Tente colocar um else no final e nos diga s emudou algo.
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;
}
}
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!
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;
}
}
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?
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 ...
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?
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();
}
}
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
int ler(char x)
Com isto ja podes usar as plicas tipo case '1'
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:
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)