Ciao a tutti, ho bisogno di utilizzare il sensore per la lettura delle impronte digitali FPC1020 su una scheda Arduino MKRZero. Il problema è che questo dispositivo viene fornito insieme a un codice di esempio che utilizza la libreria SoftwareSerial sia nel programma principale che nella classe, la quale non è utilizzabile con questa scheda. Ho provato a modificare i file .cpp e .h ma ho un errorre in fase di compilazione che non riesco a risolvere. Qui sotto riporterò i 2 codici dei file .cpp e .h che ho modificato (li inserisco in 2 messaggi diversi altrimenti non me li fa inviare), potete aiutarmi a capire dove sta il problema ? Allego come file anche i 2 codici originali e un PDF fornito dall'azienda costruttrice del sensore che potrebbe essere utile per trovare una soluzione.
Grazie in anticipo a chi può darmi una mano. A presto.
Giacomo
File .cpp:
#include "FPC1020.h"
#include "Arduino.h"
#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
// Uart *mySerial = NULL;
FPC1020::FPC1020() {
// mySerial = ser; // ...override gpsHwSerial with value passed.
Serial1.begin(19200);
}
//Function:wait data packet send finish
unsigned char FPC1020::WaitFpData(void)
{
int i;
unsigned char rBuf_p = 0;
while(Serial1.available()<= 0);
for(i=200; i>0; i--)//wait response info
{
delay(20);
rBuf[rBuf_p++] = Serial1.read();
if(Serial1.available() == 0)
{
g_ucUartRxEnd = 1;
g_ucUartRxLen = rBuf_p;
break;
}
}
if(rBuf_p == 0) return FALSE;
else return TRUE;
}
// check sum
unsigned char FPC1020::CmdGenCHK(unsigned char wLen,unsigned char *ptr)
{
unsigned char i,temp = 0;
for(i = 0; i < wLen; i++)
{
temp ^= *(ptr + i);
}
return temp;
}
// Send command
void FPC1020::UART_SendPackage(unsigned char wLen,unsigned char *ptr)
{
unsigned int i=0,len=0;
tBuf[0] = DATA_START; //command head
for(i = 0; i < wLen; i++) // data in packet
{
tBuf[1+i] = *(ptr+i);
}
tBuf[wLen + 1] = CmdGenCHK(wLen, ptr); //Generate checkout data
tBuf[wLen + 2] = DATA_END;
len = wLen + 3;
g_ucUartRxEnd = 0;
g_ucUartRxLen = len ;
Serial1.write(tBuf,len);
// Serial.print((char *)tBuf);
// UartSend(tBuf,len);
}
// response info check, return various info
unsigned char FPC1020::Check_Package(unsigned char cmd)
{
unsigned char flag = FALSE;
if(!WaitFpData()) return flag; //wait response info
// p = 0 ;
if(g_ucUartRxEnd)
g_ucUartRxEnd = 0;//clear data packet flag
else
return flag;
// if(rBuf[0] != DATA_START)return flag;
// if(rBuf[1] != cmd)return flag;
// if(rBuf[6] != CmdGenCHK(g_ucUartRxLen - 3, &rBuf[1]))return flag;
switch(cmd)
{
case CMD_ENROLL1:
case CMD_ENROLL2:
case CMD_ENROLL3:
if(ACK_SUCCESS == rBuf[4])flag = TRUE;
else if(ACK_USER_EXIST == rBuf[4])
{
flag = ACK_USER_EXIST;
delay(500);
}
else if(ACK_USER_OCCUPIED == rBuf[4])
{
flag = ACK_USER_OCCUPIED;
delay(500);
}
break;
case CMD_DELETE: //delete assigned user
if(ACK_SUCCESS == rBuf[4])flag = TRUE;
break;
case CMD_CLEAR: //delete all users
if(ACK_SUCCESS == rBuf[4])flag = TRUE;
break;
case CMD_IDENTIFY: //1:1 comparison
if(ACK_SUCCESS == rBuf[4])flag = TRUE;
break;
case CMD_USERNUMB: // get user number
if(ACK_SUCCESS == rBuf[4])
{
flag = TRUE;
l_ucFPID = rBuf[3];
}
break;
case CMD_SEARCH: //1:N comparison
if((1 == rBuf[4])||(2 == rBuf[4])||(3 == rBuf[4]))
{
flag = TRUE;
l_ucFPID = rBuf[3];
}
break;
case CMD_USERID: // Get user ID
if(ACK_SUCCESS == rBuf[4])
{
flag = TRUE;
l_ucFPID = rBuf[3];
}
break;
default:
break;
}
return flag;
}
// Fingerprint indentify 1:N
unsigned char FPC1020::Search(void)
{
unsigned char buf[BUF_N];
*buf = CMD_SEARCH; //1:N comparison
*(buf+1) = 0x00;
*(buf+2) = 0x00;
*(buf+3) = 0x00;
*(buf+4) = 0x00;
UART_SendPackage(5, buf);
return Check_Package(CMD_SEARCH);
}
// Fingerprint indentify 1:1
void FPC1020::FP_Identify(unsigned int u_id)
{
unsigned char buf[BUF_N];
*buf = CMD_IDENTIFY;
*(buf+1) = u_id>>8;
*(buf+2) = u_id&0xff;
*(buf+3) = 0x00;
*(buf+4) = 0x00;
UART_SendPackage(5, buf);
}
// Add new user Step 1
void FPC1020::Enroll_Step1(unsigned int u_id)
{
unsigned char buf[BUF_N];
*buf = CMD_ENROLL1;
*(buf+1) = u_id>>8;
*(buf+2) = u_id&0xff;
*(buf+3) = 1;
*(buf+4) = 0x00;
UART_SendPackage(5, buf);
}
// Add new user Step 2
void FPC1020::Enroll_Step2(unsigned int u_id)
{
unsigned char buf[BUF_N];
*buf = CMD_ENROLL2;
*(buf+1) = u_id>>8;
*(buf+2) = u_id&0xff;
*(buf+3) = 1;
*(buf+4) = 0x00;
UART_SendPackage(5, buf);
}
// Add new user Step 1
void FPC1020::Enroll_Step3(unsigned int u_id)
{
unsigned char buf[BUF_N];
*buf = CMD_ENROLL3;
*(buf+1) = u_id>>8;
*(buf+2) = u_id&0xff;
*(buf+3) = 1;
*(buf+4) = 0x00;
UART_SendPackage(5, buf);
}
// Add a new user
unsigned char FPC1020::Enroll(unsigned int u_id)
{
unsigned char rtflag;
Enroll_Step1(u_id);
rtflag = Check_Package(CMD_ENROLL1);
Serial.println("Get data1");
if(rtflag != TRUE) return rtflag;
delay(100);
Enroll_Step2(u_id);
rtflag = Check_Package(CMD_ENROLL2);
Serial.println("Get data2");
if(rtflag !=TRUE)return rtflag;
delay(100);
Enroll_Step3(u_id);
rtflag = Check_Package(CMD_ENROLL3);
Serial.println("Get data3");
if(rtflag !=TRUE)return rtflag;
delay(100);
}
// Delete all of the users
unsigned char FPC1020::Clear(void)
{
unsigned char buf[BUF_N];
*buf = CMD_CLEAR;
*(buf+1) = 0x00;
*(buf+2) = 0x00;
*(buf+3) = 0x00;
*(buf+4) = 0x00;
UART_SendPackage(5, buf);
return Check_Package(CMD_CLEAR);
}
// Delete assigned user
unsigned char FPC1020::Delete(unsigned int u_id)
{
unsigned char buf[BUF_N];
*buf = CMD_DELETE;
*(buf+1) = u_id>>8;
*(buf+2) = u_id&0xff;
*(buf+3) = 0x00;
*(buf+4) = 0x00;
UART_SendPackage(5, buf);
return Check_Package(CMD_DELETE);
}
// Get user ID number
unsigned char FPC1020::Read(void)
{
unsigned char buf[BUF_N];
*buf = CMD_USERNUMB;
*(buf+1) = 0x00;
*(buf+2) = 0x00;
*(buf+3) = 0x00;
*(buf+4) = 0x00;
UART_SendPackage(5, buf);
return Check_Package(CMD_USERNUMB);
}
// Get user ID number
unsigned char FPC1020::PrintUserID(void)
{
unsigned char buf[BUF_N];
*buf = CMD_USERID;
*(buf+1) = 0x00;
*(buf+2) = 0x00;
*(buf+3) = 0x00;
*(buf+4) = 0x00;
UART_SendPackage(5, buf);
return Check_Package(CMD_USERID);
}
Benvenuto. Essendo il tuo primo post, nel rispetto del regolamento, ti chiediamo cortesemente di presentartiQUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il su citato REGOLAMENTO... Grazie.
Qui una serie di link utili, non inerenti al tuo problema:
Stai cercando di modificare la libreria per usare Serial1 invece di SoftwareSerial ?
Se il compilatore segnala questa riga:
FPC1020(SoftwareSerial *ser);
vuol dire che hai quella riga che fa riferimento ad un oggetto della libreria che tu vuoi togliere.
Li dovrai passare Serial1 o comunque un puntatore a un Serial1
Ma nell'originale non c'e' quella riga. L'hai messa tu ?
La SoftwareSerial() NON esiste per MKR1000 quindi NON la puoi inserire e la devi eliminare.
C'è invece un modo per definire delle altre porte seriali oltre quelle già presenti (il SAMD21 ha 6 (0..5) moduli configurabili SERCOM che puoi usare come I2C, SPI o porta seriale). Prova a leggere QUESTO thread
nid69ita:
Stai cercando di modificare la libreria per usare Serial1 invece di SoftwareSerial ?
Se il compilatore segnala questa riga:
FPC1020(SoftwareSerial *ser);
vuol dire che hai quella riga che fa riferimento ad un oggetto della libreria che tu vuoi togliere.
Li dovrai passare Serial1 o comunque un puntatore a un Serial1
Ma nell'originale non c'e' quella riga. L'hai messa tu ?
Si l'idea è quella di utilizzare Serial1. Quindi c'è qualche parte del codice che ancora fa riferimento a SoftwareSerial ?
Giaco25:
Si l'idea è quella di utilizzare Serial1. Quindi c'è qualche parte del codice che ancora fa riferimento a SoftwareSerial ?
Se non lo sai tu !! Il codice è sul tuo pc. Ricontrolla i sorgenti e soprattutto il file .h Secondo me quello che hai postato non è quello che compili.
@Guglielmo credo che @giaco25 si accontenta di usare Serial1 (mi pare già definita), quindi cerca di sostituire la SoftwareSerial con Serial1
P.S. @Guglielmo Urca che roba bestiale a quel link. Bello poterlo fare. Ti ritrovi con una Serial2 su pin 0 e 1 un pò come la Arduino Uno :o
nid69ita:
P.S. @Guglielmo Urca che roba bestiale a quel link. Bello poterlo fare. Ti ritrovi con una Serial2 su pin 0 e 1 un pò come la Arduino Uno :o
Simpatico eh ?
Guglielmo
P.S.: Ormai quasi tutte le nuove MCU hanno introdotto questo concetto di pin indipendenti dall'uso che ne fai, poi ... ti configuri tu la MCU collegando le varie risorse hai vari pin. La cosa si sta compliacndo a tal punto che ... a "manina" sta diventando veramente difficile e, quasi tutti i produttori, offrono tools grafici di configurazione. Atmel offre "START", Microchip offre "MCC" sui pic 8/16 ed "Harmony" sui PIC32, e così via ...
nid69ita:
Se non lo sai tu !! Il codice è sul tuo pc. Ricontrolla i sorgenti e soprattutto il file .h Secondo me quello che hai postato non è quello che compili.
@Guglielmo credo che @giaco25 si accontenta di usare Serial1 (mi pare già definita), quindi cerca di sostituire la SoftwareSerial con Serial1
P.S. @Guglielmo Urca che roba bestiale a quel link. Bello poterlo fare. Ti ritrovi con una Serial2 su pin 0 e 1 un pò come la Arduino Uno :o
Il file che ho postato è proprio quello che compilo, quello originale è tra gli allegati del primo messaggio. Avevo intuito che ci potesse essere una parte di codice che ancora fa riferimento a SoftwareSerial ma sono giorni che sto cercando di risolvere questo problema e non capisco quale parte è che mi causa questo problema !!!
Secondo me hai più copie di quella libreria e viene presa un'altra copia ...
Fai una cosa, nell'IDE vai nelle "Impostazioni" (Preferences) e metti il segno di spunta nel dettaglio (verbose) sia della compilazione che dell'upload ... ti darà molte più informazioni, inclusa la path completa del file che da l'errore.
gpb01:
Secondo me hai più copie di quella libreria e viene presa un'altra copia ...
Fai una cosa, nell'IDE vai nelle "Impostazioni" (Preferences) e metti il segno di spunta nel dettaglio (verbose) sia della compilazione che dell'upload ... ti darà molte più informazioni, inclusa la path completa del file che da l'errore.
Guglielmo
Ho provato a fare in questo modo e forse il problema è proprio questo. Mi dice come ultima frase:
Uso la libreria FPC1020 nella cartella: C:\Program Files (x86)\Arduino\libraries\FPC1020 (legacy)
Ovviamente i file modificati non sono in questo percorso.
Intanto NON è normale che tu abbia messo la lib sotto "C:\Program Files (x86)\Arduino\libraries"
Sono sicuro l'hai messa tu li.
Li dentro ci vanno le lib ufficiali, le librerie aggiuntive devono stare sotto la libraries ma dove hai i progetti.
esempio da me:
E:\Arduino_projects\ dove salvo i progetti e quindi c'e'
E:\Arduino_projects\LIBRARIES e li dentro il manager delle lib mette le nuove lib o quelle caricate da zip (due voci di menu apposite).
Versione di IDE Arduino che usi ?
Ora, hai arduino ide installato qui: C:\Program Files (x86)\Arduino
Ma dalle impostazioni, dove stà la cartella degli sketch ?
Con l'IDE, menu Sketch->#include libreria
ci sono poi altre 2 voci, "gestione libreria" e "includi libreria da zip"
Per aggiungere librerie meglio usare una di quelle voci. La prima ha un elenco di lib "affidabili"
Ma se non c'e' quella ce ti serve usi la seconda voce per prendere la lib dallo zip
nid69ita:
Ma se non c'e' quella ce ti serve usi la seconda voce per prendere la lib dallo zip
L'ho aggiunta tramite file zip perchè non si trova tra quelle disponibili. Adesso allora come faccio a modificare quella libreria nel modo corretto senza fare danni come prima ?