Desarrollar una biblioteca que usa SoftwareSerial

arduino
biblioteca
softwareserial

#1

Hi folks,

estoy haciendo una biblioteca de Arduino para poder facilitar la configuración de los módulos Bluetooth HC-06, HC05. El caso es que heredo hago una encapsulación de la biblioteca SoftwareSerial, pero tengo problemas con invocándola, me explico:

  • En mi definición (el .h) le declaro un atributo de SoftwareSerial de la forma
class HC06 {
    private:
        SoftwareSerial bt;
    ...
    public:
        void begin(const long baud=9600);
  • En su implementación (el .cpp) dentro del método begin es donde llamo al constructor de SoftwareSerial para usarlo (ya que la idea es que el usuario pueda indicarle los pines de TX, RX antes de que arranque la comunicación)
void HC06(){}
...
void HC06::begin(const long baud){
    this->bt = new SoftwareSerial(this->tx, this->rx);
    delay(15);
    this->bt.begin(baud);
}
...
  • El caso es que el Platformio me da 2 errores básicamente, uno diciéndome que no llamo al constructor de SoftwareSerial, y otro diciéndome que no existe el operador = para llamar al constructor
lib/HC06/Hc06.cpp: In constructor 'HC06::HC06()':
lib/HC06/Hc06.cpp:3:12: error: no matching function for call to 'SoftwareSerial::SoftwareSerial()'
HC06::HC06()
^
...
lib/HC06/Hc06.cpp: In member function 'void HC06::begin(long int)':
lib/HC06/Hc06.cpp:28:14: error: no match for 'operator=' (operand types are 'SoftwareSerial' and 'SoftwareSerial*')
this->bt = new SoftwareSerial(this->hc_tx, this->hc_rx);
^
  • Para el primero he probado inicializando nulo el atributo bt en la defición (@MiguelAngelLV lo que no se es si usar NULL o null_ptr), pero ahora me da otro error
class HC06 {
    private:
        SoftwareSerial bt = NULL;
...
from src/main.cpp:1:
lib/HC06/Hc06.h:11:29: error: could not convert '0' from 'int' to 'SoftwareSerial'
SoftwareSerial bt = NULL;
^

Imagino que la solución va a pasar por declarar la variable bt como un puntero, pero prefiero ponerlo por aquí para si alguien más se tiene que pelear con esto luego


#2

Bueeenoooo librerias de arduino. Primero y más importante que hardware estas utilizando; si es un Arduino UNO suele pasar que se le vaya la pinza y sobre todo con los Bluetooth usando el Software Serial…

Con respecto a lo de NULL creo que no es necesario que lo pongas (lo siento esto no es Java) ya que NULL es un define a 0. Por eso te falla…

Además si lo que quieres es usar esa propiedad yo lo crearía como puntero para poder usarlo dinamicamente…

Como veo que @MiguelAngelLV esta respondiendo mientras escribo seguramente te dará mas información…


#3

SoftwareSerial no lo has declarado como puntero, por tanto, no puedes igualarlo a null ni hacerle «un new».

class HC06 {
    private:
        SoftwareSerial * bt = nullptr; //Ahora se recomienda usar nullptr en vez de NULL.

void HC06::begin(const long baud){
    this->bt = new SoftwareSerial(this->tx, this->rx);
    delay(15);
    this->bt->begin(baud);
}

Por otro lado, si no hay ambiguedad, no hay (ni se recomienda) que usar el «this» para referirse a propiedades de la clase.

Finalmente, no estás usando «herencia», estás haciendo encapsulación.


#4

He aplicado tu solución @MiguelAngelLV y ya me no me da fallo. Tampoco sabía lo del this gracias Miguel :wink:

Resumiendo para el siguiente que venga, la solución ha pasado por definir bt como un puntero

class HC06 {
    private:
        SoftwareSerial *bt = nullptr;
...
  • Cuando llamo al constructor ahora no voy a tener problema, pero ya no debo de usar el bt.<metodo_de_SoftwareSerial>, sino bt-><metodo_de_SoftwareSerial>
void HC06::begin(const long baud){
    this->bt = new SoftwareSerial(this->tx, this->rx);
    delay(15);
    // this->bt.begin(baud); ¡¡¡Esto está mal porque ahora es un puntero, no una variable normal!!!
    this->bt->begin(baud);
...

#5

Correcto…

Esto con java no pasaba…

Molaria una clase /taller sobre estos temas…

PD: alla va el spam… https://booleanbite.com/web/crear-libreria-para-arduino/


#6

En kotlin tienes el maravilloso «delegate by» para hacer herencia mediante encapsulación.

https://kotlinlang.org/docs/reference/delegation.html


#7

Y cuando dices que nos vas a hacer un taller de kotlin nativo???


#8

La parte «native» todavía no la termino de llevar bien. Hay mucho jaleo con el tema de los scope de memoria y de como integrar bibliotecas de C en Kotlin. Casi que lo cambian en cada versión…


#9

Este tema se cerró automáticamente 20 días después del último post. No se permiten nuevas respuestas.