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
Hummmm
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.
#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:
D:/Arduino Projects/esclavo/esclavo.ino:16:24: error: invalid initialization of reference of type 'HardwareSerial&' from expression of type 'SoftwareSerial'
funcionImprime(miSerial);
^
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.
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:
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.