[SOLUCIONADO] Pasar de SoftwareSerial a HardwareSerial

Buenas de nuevo, estoy intentando pasar la librería del FPC1020 (lector de huellas dactilar) de SoftwareSerial a HardwareSerial ya que estoy usando un Mega 256 Pro y este cuenta con los mismos puertos series que el Mega normal. El problema que me he encontrado es el mismo que este post FPC1020 Using Arduino pro micro - Programming Questions - Arduino Forum pero no he querido responder en él por ser un poco viejo.

El problema principal viene dado porque la librería crea la clase FPC1020 con funciones y no se porque no me sale substituirla y seguro que es una chorrada.

#include <FPC1020.h>


extern unsigned char l_ucFPID;
extern unsigned char rBuf[192];  //Receive return data

#define swSerial Serial1
//HardwareSerial &swSerial = Serial1;
FPC1020 Finger(&swSerial);

void setup(){
    Serial.begin(19200);
    Serial1.begin(19200);
    pinMode(4, INPUT); // IRQ
    
    Serial.println("Fingerprint Test ! ");
}

void loop(){
    unsigned int User_ID = 0;
    unsigned char incomingNub;
    unsigned int  matchUserID = 0;
    unsigned char rtf = 0;
    
    while(1){
        Serial.println("============== Menu ================");
        Serial.println("Add a New User ----------------- 1");
        Serial.println("Fingerprint Matching --------------- 2");
        Serial.println("Get User Number and Print All User ID ------ 3 ");
        Serial.println("Delete Assigned User --------- 4");
        Serial.println("Delete All User ---------- 5");
        Serial.println("============== End =================");
        
        unsigned char  MODE = 0;
        
        while(Serial.available()<=0);
        
        MODE = Serial.read()-0x30;
        
        switch(MODE){
          case 0:  // Null
              break;
          
          case 1:   // Fingerprint Input and Add a New User
              MODE = 0;
              User_ID = 0;
              
              Serial.println("Please input the new user ID (0 ~ 99).");
              while(Serial.available()<=0);
              delay(100);
              incomingNub = Serial.available();
              for(char i=incomingNub; i>=1; i--){
                  User_ID = User_ID + (Serial.read()-0x30)*pow(10,(i-1));
              }
              
              Serial.println("Add Fingerprint, please put your finger on the Fingerprint Sensor.");
              rtf = Finger.Enroll(User_ID);
              
              if(rtf == TRUE) { 
                  Serial.print("Success, your User ID is: "); 
                  Serial.println( User_ID , DEC);
              }
              else if (rtf == FALSE) {
                  Serial.println("Failed, please try again.");
              }
              else if( rtf == ACK_USER_OCCUPIED){
                  Serial.println("Failed, this User ID alread exsits.");
              }
              else if( rtf == ACK_USER_EXIST){
                  Serial.println("Failed, this fingerprint alread exsits.");
              }
              delay(2000);
              break;
         
         case 2:  // Fingerprint Matching
             MODE = 0 ;                                   
             Serial.println("Match Fingerprint, please put your finger on the Sensor.");
             for (int a=0;a<3;a++){
             if( Finger.Search()){
             Serial.print("Success, your User ID is: "); 
             Serial.println( l_ucFPID, DEC);
             a=3;
             }
             
             else {
                 Serial.println("Failed, please try again.");
             }} 
             delay(1000);
             break;
         
         case 3:   // Print all user ID
             MODE = 0;
             if(Finger.PrintUserID()){
                 Serial.print("Number of Fingerprint User is:"); 
                 unsigned char UserNumb;
                 UserNumb = (l_ucFPID-2)/3;
            
                 Serial.println(UserNumb,DEC);
                 Serial.println("Print all the User ID:"); 
                 
                 for(char i = 0; i < UserNumb; i++){
                     Serial.println(rBuf[12+i*3],DEC);
                 }
             }
             
             else {
                 Serial.println("Print User ID Fail!");
             }
             delay(1000);
             break;
             
         case 4:   // Delete Assigned User ID
             MODE = 0;
             User_ID = 0;
             Serial.println("Please input the user ID(0 ~ 99) you want to delecte.");
             while(Serial.available()<=0);
             delay(100);
             incomingNub = Serial.available();
             for(char i=incomingNub; i>=1; i--){
             User_ID = User_ID + (Serial.read()-0x30)*pow(10,(i-1));
             }
             
             if(Finger.Delete(User_ID)) {
                Serial.println("Delete Fingerprint User Success!"); 
             }   
             else{
                 Serial.println("Delete Fingerprint User Fail!");
             }
             delay(1000);
             break;
         
         case 5:  // Delete All User ID
             
             MODE = 0;
             unsigned char DeleteFlag = 0;
                
                Serial.println("Delete All Users, Y/N ?");
                
                for(unsigned char i=200; i>0; i--)//wait response info
                {
                    delay(20);
                    if(Serial.available()>0)
                    {
                        DeleteFlag = Serial.read();
                        break;
                    }
                }
                
                if(DeleteFlag == 'Y'||'y'){
                    if(Finger.Clear()){
                    Serial.println("Delete All Fingerprint User Success!");
                    }
                    else{
                    Serial.println("Delete All Fingerprint User Fail!");
                    }
                }
                delay(500);
                break;
     }
  }
}

La clase definida en la librería:

class FPC1020
{
    public:
    
    FPC1020(HardwareSerial*ser);
    unsigned char Enroll(unsigned int u_id);
    unsigned char Clear(void);
    unsigned char Delete(unsigned int u_id);
    unsigned char Search(void);
    unsigned char Read(void);   
    unsigned char PrintUserID(void);
    
    private:
    unsigned char WaitFpData(void);
    unsigned char CmdGenCHK(unsigned char wLen,unsigned char *ptr);
    void UART_SendPackage(unsigned char wLen,unsigned char *ptr);
    unsigned char Check_Package(unsigned char cmd);
    void FP_Identify(unsigned int u_id);
    void Enroll_Step1(unsigned int u_id);
    void Enroll_Step2(unsigned int u_id);
    void Enroll_Step3(unsigned int u_id);
    
    
};
#define UART_BUF_LEN  8
#define BUF_N 8

unsigned char rBuf[192];  //Receive return data
unsigned char tBuf[UART_BUF_LEN];  //Send commands or data
unsigned char g_ucUartRxEnd ;      //Receive return data end flag
unsigned char g_ucUartRxLen ;      //Receive return data length
unsigned char l_ucFPID =1;         //User ID

HardwareSerial *mySerial = NULL;

FPC1020::FPC1020(HardwareSerial*ser) {
  mySerial = ser; // ...override gpsHwSerial with value passed.
  mySerial->begin(19200);
}

Los errores que me envía son:

FPC1020.h:37:27: error: expected ')' before '*' token

     FPC1020(HardwareSerial*ser);

                           ^
FPC1020.cpp:20:1: error: prototype for 'FPC1020::FPC1020(HardwareSerial*)' does not match any in class 'FPC1020'

 FPC1020::FPC1020(HardwareSerial*ser) {

 ^~~~~~~

FPC1020.h:33:7: error: candidates are: constexpr FPC1020::FPC1020(FPC1020&&)

 class FPC1020

       ^~~~~~~

FPC1020.h:33:7: error:                 constexpr FPC1020::FPC1020(const FPC1020&)

FPC1020.h:33:7: error:                 constexpr FPC1020::FPC1020()

Cualquier ayuda será de agradecer

He modificado la librería y te la dejo como attachment (es muy grande para postear como texto).

Compila, pero no se si funciona, ya que no tengo ni Mega ni el lector de huellas.

He cambiado todos los "SoftwareSerial" por "HardwareSerial" e incluido la libreria HardwareSerial.h para que funcione.

FPC1020.zip (2.64 KB)

Creo que se esta quejando que no le pasas un objeto serial, prueba simplemente creando el objeto con
FPC1020 Finger(Serial1)

Gracias a los dos. Después de ver las dos respuestas he caído que victorjam tiene toda la razón. He incluido la librería HardwareSerial en el FPC1020.h y listo, compila a la primera

Repito Gracias, cambio el título a solucionado

Discúlpame que insista, pero creo que no es necesario incluir a la librería HardwareSerial.H ,Serial1 ya es un objeto de esa librería.

Discúlpame que insista, pero creo que no es necesario incluir a la librería HardwareSerial.H ,Serial1 ya es un objeto de esa librería.

El problema de compilación venía de la propia libreria que él modificó. Solo incluia SoftwareSerial. Así que al hacer la modificación por HardwareSerial había que incluir esa libreria o, mejor, arduino.h que es la que incluye todo lo de Arduino. Si no se hace, en el .ino si se reconoce el objeto Serial, pero la libreria no sabe lo que es.

La primera que me vino a la cabeza fue HardwareSerial, pues es lo que estaba intentado usar. Quizás sería más correcto que la libreria incluyera arduino.h.