Problema al instanciar SoftwareSerial en libreria propia [SOLUCIONADO]

Buenas a todos, estoy tratando de crear una librería para mi proyecto. Dado que la comunicación debe ser con el puerto serial, necesito poder emplear otros pines a los por defecto.

De hay mi pregunta, ¿como hago para instanciar un objeto de la clase SoftwareSerial en la librería? A esta instancia la he llamado MD49toArduino, pero soy incapaz de que el compilador me diga donde me estoy equivocando.

Os he puesto una pequeña parte de la librería, si sustituyo MD49toArduino por Serial, funciona sin ningún problema.

Espero que podáis ayudarme, saludos

MD49_Arduino.h

//Guards
#ifndef MD49_Arduino_H
#define MD49_Arduino_H
#define LIBRARY_VERSION	1.2

#include <Arduino.h>
#include <SoftwareSerial.h>

// Values of 0 being sent over serial write have to be cast as a byte so they arent misinterpreted as NULL
// This is a bug with arduino 1.0
#define CMD               (byte)0x00                        // MD49 command address of 0                                                                 
#define GET_SPEED1              0x21
#define SET_SPEED1              0x31

#define TIME_DELAY_COMMUNICATION	5 	// TIEMPO EN MILISEGUNDOS DEL DELAY

class MD49_Arduino{
	public:
		// Constructors
		MD49_Arduino();

		// Metodos Getters
		int getSpeed1();
		.
		.
		.

		// Metodos Setters
		void setSpeed1(int speed);
		.
		.
		.

		// Metodos auxiliares
		void stop();
		SoftwareSerial MD49toArduino(4,2);
};
#endif
include "Arduino.h"
#include "MD49_Arduino.h"

MD49_Arduino::MD49_Arduino(){
    	Md49toArduino = SoftwareSerial::SoftwareSerial MD49toArduino(4,2);
	MD49toArduino.begin(38400);		
}

int MD49_Arduino::getSpeed1(){
    byte vel;
    int velocidad;

    MD49toArduino.flush();
    MD49toArduino.write(CMD);
    MD49toArduino.write(GET_SPEED1);

    while( MD49toArduino.available() < 1 )
        delay(TIME_DELAY_COMMUNICATION);

    vel = MD49toArduino.read();
    velocidad = (int)vel;

    return velocidad;
}

Que tal algo asi

Library.h File

#ifndef Library_h
#define Library_h
#include "Arduino.h" 
#include <SoftwareSerial.h> //Software Serial Library

class Library
{
	public:
		//Aca va lo que quieras
	
	private:
		SoftwareSerial mySerial;
}

Library.cpp File

#include "Library.h"
#include "Arduino.h" 

mySerial = SoftwareSerial(2, 3); //Aca podes intentar con otras commbinaciones.

Library::Library()  
{
	mySerial.begin(9600);
}

El Sketch

#include <SoftwareSerial.h>
#include <Library.h>

Library Library;
void Setup()
{
}

void loop()
{
}

surbyte gracias por la ayuda, pero no me ha funcionado.

Al final la única forma que he conseguido encontrar a sido declarar en el .h a piñón fijo. Mañana os contare si funciona que como me ponga a hacer ruido ahora con el robot me matan.

El problema de la solución que he encontrado es obvio, me impide pasarle los parámetros que quiera indicarle los pines que quiero usar, por lo que con esta librería solo podría manejar una controladora a la vez.

Si alguno conoce alguna manera mejor, o que se le pudieran pasar los parámetros llamando al constructor de la clase seria genial. Porque lo dicho, no puedo intentar crear la instancia en el cpp, ni en los constructores, he probado tanto en el por defecto como indicándole parámetros y nada.

Un saludo a todos

.h

#ifndef Library_h
#define Library_h
#include "Arduino.h" 
#include <SoftwareSerial.h> //Software Serial Library

class Library
{
	public:
		//Aca va lo que quieras
	
	private:
		SoftwareSerial mySerial = SoftwareSerial(2,4);
}

bidi3:
Si alguno conoce alguna manera mejor, o que se le pudieran pasar los parámetros llamando al constructor de la clase seria genial. Porque lo dicho, no puedo intentar crear la instancia en el cpp, ni en los constructores, he probado tanto en el por defecto como indicándole parámetros y nada.

Tomándo el ejemplo de surbyte, ya intentaste esto?

#include "Library.h"
#include "Arduino.h" 

Library::Library(byte rx, byte tx)  
{
      
        mySerial = SoftwareSerial(rx, tx);
 mySerial.begin(9600);
// Si necesitas también definir la tasa de baudios en el constructor,
// pide un tercer parámetro tipo unsigned long
}

Recuerda actualizar la definición del constructor en el .h :wink:

Lucario448 perdona que no te cite, pero es que con el código queda algo un poco caótico de leer.

Gracias por la idea, he probado a usar el constructor por parámetros, manteniendo el por defecto. Aun así, si no instancio la clase SoftwareSerial en el .h, y luego la instanció en los constructores, me dice que no encuentra el objeto. Creo que es porque no se crea la variable a la que posteriormente asignaremos el objeto.

La "forma" que he encontrado, porque es una chapuza en toda regla, es mantener la definición de la instancia en el .h, y luego en el constructor parametrizado vuelvo a asignarle una nueva instancia de la clase SoftwareSerial en los pines que necesito. Gracias por indicarme que sea del tipo unsigned long la tasa de baudios, porque no encontraba el tipo de dato que era.

El problema de mi método, es que no he encontrado destructor para la primera instancia, y si uso el constructor con parámetros, puede que haya algún problema con la primera instancia creada.

Un saludo a todos, y gracias por los aportes.

.h

#ifndef Library_h
#define Library_h
#include "Arduino.h" 
#include <SoftwareSerial.h> //Software Serial Library

class Library
{
	public:
		Library();
                Library(uint8_t rx, uint8_t tx, unsigned long bauds = 38400, bool inverse_logic = false );
	        SoftwareSerial mySerial = SoftwareSerial(2,4); // Lo declaro como public por comodidad,
                                                                                 // se que deberia ser menos vago, pero 
                                                                                 //asi puedo hacer uso de sus metodos si                                                                                                                                                                    
                                                                                 //los necesito
		
}

.cpp

#include "Arduino.h"
#include "Library.h"


Library::Library(){
    mySerial .begin(38400);		
    
}

Library::Library(uint8_t rx, uint8_t tx,unsigned long bauds , bool inverse_logic){
    mySerial = SoftwareSerial(rx,tx,inverse_logic);
    Library.begin(bauds);
}

Hola.
Prueba así:

MD49toArduino.h

//Guards
#ifndef MD49_Arduino_H
#define MD49_Arduino_H
#define LIBRARY_VERSION	1.2

#include <Arduino.h>
#include <SoftwareSerial.h>

class MD49_Arduino{
	public:
		MD49_Arduino(int rx=4, int tx=5); // Si se llama sin parámetros, por defecto serán 4 y 5
	private:
		SoftwareSerial MD49toArduino;
};
#endif

MD49toArduino.cpp

#include <Arduino.h>
#include "MD49_Arduino.h"

MD49_Arduino::MD49_Arduino(int rx, int tx):MD49toArduino(rx,tx){
	MD49toArduino.begin(38400);	
}

noter, muchas gracias por la respuesta, es justamente lo que buscaba.

No he tenido mucho tiempo de buscar el porque funciona, pero me imagino que lo que hace es llamar al constructor de la variable.

Un saludo a todos

Efectivamente, en el propio constructor de la clase se pueden instanciar los constructores de sus miembros de la forma que te he indicado.
Si no tienes más dudas, puedes marcar el post como solucionado para su cierre.
Saludos.