Go Down

Topic: una sola rutina de lectura y 2 seriales para ahorrar codigo? (Read 176 times) previous topic - next topic

maxid

Existe alguna forma de en una rutina enviarle el puntero del Serial y del SoftwareSerial para usar la misma rutina de lectura de codigos?
Digo para no repetir en mismo Serial.avaible() etc y softSerial.avaible() etc en dos rutinas que hacen lo mismo

Estoy muy oxidado con C
El que pregunta aprende, el que responde aprende a responder.

noter

Hummmm :smiley-eek-blue:
En principio la cosa me parece difícil, pues aunque ambas tienen los mismos métodos, se trata de dos clases diferentes. Otra cosa sería usar varios puertos hardware o varios software, en cuyo caso podrías pasar puntero o referencia de Serial, Serial1... y tratarlos en la misma función; pero supongo que si la función espera un puntero a hardwareserial y le envías uno de softwareserial o viceversa, te dará error de compilación.
Voy a hacer un par de pruebas para confirmártelo.
Saludos.

noter

Observa:

Code: [Select]

#include <SoftwareSerial.h>

SoftwareSerial miSerial(8,9);

void setup()
{
Serial.begin(9600);
miSerial.begin(9600) ;
}


void loop()
{
funcionImprime(Serial);
funcionImprime(Serial1);
// Si descomentamos la siguiente línea da el error mencionado.
//funcionImprime(miSerial);
}

void funcionImprime(HardwareSerial &puerto){
  puerto.println("Hola");
}


El código tal y como está compila perfectamente (para mega u otro arduino que tenga más de un serial). Sin embargo, si descomento e intento enviar miSerial (softwareserial), nos arroja el error esperado:

Code: [Select]

D:/Arduino Projects/esclavo/esclavo.ino:16:24: error: invalid initialization of reference of type 'HardwareSerial&' from expression of type 'SoftwareSerial'

 funcionImprime(miSerial);
                        ^

noter

¡EJEM!  8)

Después de unas pocas pruebas más, he llegado a esto, aunque igual es un poco chapuza.

Code: [Select]

#include <SoftwareSerial.h>

SoftwareSerial miSerial(8,9);

void setup()
{
Serial.begin(9600);
miSerial.begin(9600) ;
miSerial.println("INICIO...");
}


void loop()
{
funcionImprime(Serial);
funcionImprime(miSerial);
}

void funcionImprime(Stream &puerto){
  puerto.println("Hola");
}

Puedes intentar así, aunque no sé si te funcionará para todos los comandos serial, ni si realmente ahorrarás memoria.

(Que conste que yo también me he sorprendido y aprendido algo nuevo; pero era un reto interesante ;) )

surbyte

Buena Serafín, lo único que sabía era void funcionImprime(XXXX &puerto){

No sabía como definir el puerto.

maxid

Bueno Bueno. Aca si que hay cabeza!!!.
Sabia que de Stream heredan muchas cosas pero en arduino estoy algo confundido, por mas de 10 años de usar pascal.
Lo que busco es un puntero a funcion u objeto. Si Serial y miSerial son objetos y tienen los mismos metodos deberia poder hacerlo. En object pascal existe el TObject que es el padre de todos los objetos.
Con pasarle el puntero del obejto despues puedo trabajarlo.
Pero aca todo es mas reducido y no creo tenga una herencia de clases tan grande.

Pero por lo que dice la documentacion parece que si funciona, porque todos los metodos existen en stream.
El que pregunta aprende, el que responde aprende a responder.

maxid

Compila y ahorro 40bytes de codigo, la ram no se modifica.
Mañana pruebo con el hard a ver si los lee.

Gracias Amigos.
El que pregunta aprende, el que responde aprende a responder.

noter

Ayer lo simulé en proteus y sí parecía funcionar.
Supongo que lo sabes, y aunque me parece más "natural" usar referencias que punteros, también podrías definir la función como puntero:
Code: [Select]
#include <SoftwareSerial.h>

SoftwareSerial miSerial(8,9);

void setup()
{
Serial.begin(9600);
miSerial.begin(9600) ;
miSerial.println("INICIO...");
}


void loop()
{
funcionImprime(&Serial);
funcionImprime(&miSerial);
}

void funcionImprime(Stream *puerto){
  puerto->println("Hola");
}

maxid

estoy muy oxidado, me puedes apuntar una gui o donde leer mas de c para arduino?
El que pregunta aprende, el que responde aprende a responder.

surbyte

No cualquier C, tu pides un C para arduino avanzado.

maxid

Eso, Eso. Porque no se bien que es si C o wiring al final.
El que pregunta aprende, el que responde aprende a responder.

noter

Esto no es tanto C para arduino (al fin y al cabo no deja de ser C); está más en el ámbito de C++ (clases, herencias, polimormismo, etc). Hay muchos libros interesantes de C++. Yo, para consultas suelo mirar por ejemplo en el curso C++ de conclase.net, aunque hay muchas más, y lo mejor es buscar el que mejor entendamos.
Saludos.

maxid

Gracias.
Tambien encontre un libro muy bueno en amazon Programming Arduino Next Steps
Muy bueno para exprimir al maximo arduino
El que pregunta aprende, el que responde aprende a responder.

Go Up