Errori nella compilazione libreria

Salve, sono nuovo del forum :slight_smile:
in questi giorni mi sono cimentato nel creare una nuova libreria per un modulo radio.

nella mia libreria includo anche la libreria “SotfwareSerial.h”.

gli errori riscontrati sono i seguenti e non so più dove battere la testa (premetto che è la mia prima libreria non sono alle prime armi con il linguaggio)

Errore:
C:\Program Files (x86)\Arduino\libraries\RFSDS\RFSDS.cpp: In member function ‘void RFSDS::SerialSetup(int, int)’:
C:\Program Files (x86)\Arduino\libraries\RFSDS\RFSDS.cpp:13:11: error: request for member ‘begin’ in ‘mySerial’, which is of non-class type ‘SoftwareSerial(int, int)’
mySerial.begin(9600);
^
Errore durante la compilazione

Allego i file .cpp e .h

Grazie per il sostegno :frowning:

RFSDS.cpp (1.42 KB)

RFSDS.h (589 Bytes)

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni e a leggere il regolamento se non lo hai già fatto: Regolamento Qui una serie di link utili, non inerenti al tuo problema: - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - qui le pinout delle varie schede by xxxPighi: Pinout - qui una serie di link [u]generali[/u] utili: Link Utili

ho messo la include anche nello sketch (anche se in un futuro vorrei ometterlo, per creare una libreria più intuitiva possibile), ma comunque l'errore non scomprare :(

errore :

C:\Program Files (x86)\Arduino\libraries\RFSDS\RFSDS.cpp: In member function 'void RFSDS::SerialSetup(int, int)': C:\Program Files (x86)\Arduino\libraries\RFSDS\RFSDS.cpp:13:11: error: request for member 'begin' in 'mySerial', which is of non-class type 'SoftwareSerial(int, int)' mySerial.begin(9600); ^ Errore durante la compilazione

Ecco il codice che non riesco a compilare :frowning:

#include <RFSDS.h>
#include<SoftwareSerial.h>

RFSDS myNet;

void setup() {
 myNet.Family("EC7E");               
 myNet.Address ("ABE2");             
 myNet.Ch ("07");                    
 myNet.init ();       
}

void loop() {
}

Nello sketch qua sopra aggiungi prima di setup():

SoftwareSerial mySerial(10, 11); // RX, TX

Al posto di 10 e 11 metti i pin reali che vuoi usare per RX e TX.

Nella classe del primo post è più complicato. La cosa più semplice è metterlo ugualmente in cima e toglierlo da init(). Se non lo usi fuori da quella classe è meglio dichiararlo pure static.

@Matteo, per cortesia, il codice racchiudilo nei tag code. In pratica usi il primo pulsante </> della toolbar. Grazie.

P.S. che bruttura tutte quelle righe vuote.

ok scusa non avevo capito come inviare il programma :slight_smile:

@SukkoPera

io non voglio inserirlo da sketch ma da libreria.
vorrei che nella funzione SerialSetup() della libreria imposti i pin di RX di TX e che dia il begin alla mySerial…
ma tutto ciò non voglio farlo da programma… perché da programma l’ho già fatto e so che funziona ma vorrei che fosse implementato all’interno della libreria

grazie per le risposte

aspetto aggiornamenti:)

E allora devi dichiarare mySerial come membro (privato) della classe e inizializzarlo mediante initializer list dal costruttore della tua classe, che dovrai aggiungere.

Se SoftwareSerial vuole i pin solo nel costruttore non puoi farlo da SerialSetup(), a meno di non dichiararlo come puntatore e creare un nuovo oggetto in SerialSetup(). Ma questo richiede allocazione dinamica della memoria con tutti i problemi che si porta dietro in un ambiente ristretto come è un microcontrollore.

Purtroppo non conosco il c++ e non ho ben capito la risposta che mi ha fornito... potrebbe farmi un esempio così da poter capire l'errore ?

se vuole può farlo anche direttamente nella libreria che ho pubblicato prima sopra :)

Grazie ancora del sostegno e della disponibilità

Niente, per come è fatta la libreria SoftwareSerial, quanto segue non si può evitare:

RFSDS.h, tra i membri private aggiungi:

SoftwareSerial mySerial;

e tra i membri public rinomina SerialSetup in RFSDS, che diventa così il costruttore:

RFSDS (int RX,int TX);

Poi, in RFSDS.cpp rinomina SerialSetup in RFSDS anche lì e rendila così:

RFSDS::SerialSetup (int RX, int TX): mySerial (RX, TX) {

 _RX=RX;
 _TX=TX;

 mySerial.begin(9600);
}

A questo punto per utilizzare il tuo oggetto dovrai fare:

RFSDS myNet (10, 11);

Spero sia tutto chiaro. Volendo evitare di usare allocazione dinamica, il C++ non ti permette di fare diversamente.

PS: Per convenzione, i nomi delle variabili dovrebbero perlmeno iniziare con una minuscola.

Grazie mille per la risposta dettagliata, ma continua a darmi un errore... diverso però :(

Errore:

C:\Program Files (x86)\Arduino\libraries\RFSDS\RFSDS.cpp:7:34: error: return type specification for constructor invalid void RFSDS::RFSDS (int RX, int TX): mySerial(RX,TX){ ^ Errore durante la compilazione

penso che faccia riferimento a questa parte del codice:

void RFSDS::RFSDS (int RX, int TX): mySerial(RX,TX){

    _RX = RX;
    _TX = TX;

    mySerial.begin(9600);

}

Ho lasciato un void di troppo, toglilo. Ho già corretto sopra.

Grazie mille adesso funziona TUTTO :):slight_smile:

Scusate per il tempo che vi ho fatto perdere:)