Good day!
I want to make some program, who will connect with fingerprint sensor, send the database of templates and do scan of fingers. But I have problem: when I try send some template to controller, he send me answer {0xEF 0x1 0xFF 0xFF 0xFF 0xFF 0x7 0x0 0x3 0x1 0x0 0xB}, who means that have an error when receiving data package.
May be I send wrong data or I take mistake in sending, but I don't now what to do .
P.S.: I use zfm-20 (if I am not mistaken) & I tryed search any answers in Google, but without results
The code of my Arduino program
#include <Adafruit_Fingerprint.h>
#include <SoftwareSerial.h>
int getFingerprintIDez();
SoftwareSerial mySerial(2, 3);
Adafruit_Fingerprint finger = Adafruit_Fingerprint(&mySerial);
void setup()Â
{
 while(!Serial);
 Serial.begin(9600);
 Serial.println("finger template test");
 finger.begin(57600);
 if (finger.verifyPassword()) {
  Serial.println("Found fingerprint sensor!");
 }
 else {
  Serial.println("Did not find fingerprint sensor :(");
  while (1);
 }
 uploadFingerpintTemplate(1);
}
void loop()
{
}
uint8_t getReply(uint8_t* packet){
 uint8_t reply[20], idx, ext;
 uint16_t timer=0;
 uint16_t timeout = 2000;
 ext = -1;
 idx = 0;
 delay(300);
 do{
  while (!mySerial.available()) {
   delay(1);
   timer++;
   if (timer >= timeout)
   {
    return idx;
   }
  }
  packet[idx] = mySerial.read();
  Serial.print("0x");
  Serial.print(packet[idx], HEX);
  Serial.print("\t");
  if((idx+1)%16==0)     {
   Serial.println("");
  }
  //  packet[idx] = reply[idx];
  if ((idx == 0) && (packet[0] != (FINGERPRINT_STARTCODE >> 8)))
   continue;
  if(idx == 8)
  {
   uint8_t buf = packet[8];
   ext = buf + idx + 1;
  }
  idx++;
  if(ext == idx){
   Serial.println("");
   return idx;
  }
 }
 while (mySerial.available());
 return idx;
}
uint8_t uploadFingerpintTemplate(uint16_t id) //Сделал Aronll
{
 uint8_t p ;
 uint8_t temp1[] = {
  0xEF, 0x1, 0xFF, 0xFF, 0xFF, 0xFF, 0x2, 0x0, 0x82, 0x3, 0x1, 0x61, 0x15, 0x82, 0x0, 0xFF,
  0xFE, 0xC1, 0xFE, 0x80, 0x1E, 0x80, 0xE, 0x80, 0xE, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0,
  0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0,
  0x6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x56,
  0x4E, 0x81, 0x31, 0x3E, 0x86, 0x38, 0x9E, 0xBD, 0x15, 0xD2, 0x2D, 0x3F, 0x8A, 0x4D, 0x17, 0x30,
  0x5F, 0x21, 0x5F, 0x58, 0xB6, 0xDF, 0x85, 0x45, 0xDF, 0x94, 0x1, 0xFF, 0x2, 0x82, 0xC0, 0xC,
  0xE8, 0xC3, 0x97, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
  0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
  0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
  0x0, 0x7, 0xEF, 0xFF, 0xFF, 0x82, 0x1, 0x82, 0xFF, 0xFE, 0x3E, 0x1E, 0x0, 0x0, 0x1E, 0x1E,
  0x0, 0x0, 0x1E, 0x1E, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0xD6, 0x2B,
  0x5E, 0xBC, 0xFE, 0xBC, 0xBE, 0x9, 0x22, 0x53, 0x4A, 0x97, 0x13, 0x5F, 0x95, 0x9F, 0x95, 0x2D,
  0xC1, 0x46, 0x97, 0x30, 0x9F, 0x39, 0x3F, 0xC0, 0x17, 0xA9, 0x30, 0xD3, 0x3F, 0xFA, 0x54, 0xEF,
  0xFF, 0xFF, 0x0, 0x26, 0x56, 0x25, 0x18, 0xAF, 0x38, 0x23, 0x41, 0x1, 0x1D, 0x6C, 0xAE, 0xAF,
  0x29, 0xD, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
  0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0  };
 p = finger.downloadImageToCharBuf(1);
 switch (p) {
 case FINGERPRINT_OK:
  Serial.println("0All good");
  break;
 default:
  Serial.println("0Unknown error ");
  return p;
 }
 // mySerial.write(temp1,256);
 uint8_t ans[20];
 int dsa = 0;
 int lon = 256;
 int leg = 0;
 for(int i = 0; i < lon; i++){
  Serial.print(i);
  ans[dsa] = mySerial.read();
  if ((ans[0] == (FINGERPRINT_STARTCODE >> 8)) ||
   (ans[1] == (FINGERPRINT_STARTCODE & 0xFF)))
  {   Â
   if(dsa==8){
    uint8_t packettype = ans[6];
    uint16_t len = ans[7];
    len <<= 8;
    len |= ans[8];
    lon = len;
    leg = len + 9;
    lon += i + 1;
   }  Â
   dsa++;
  }
  else{
   mySerial.write(temp1[i]);
  }
 }
 for(int i = 0; i < leg; i ++){
  Serial.print("\t0x");
  Serial.print(ans[i], HEX);
 }
 return 0;
}
And some code of my revision of the library Adafruit_Fingerprint.cpp
uint8_t Adafruit_Fingerprint::uploadImageFromCharBuf(uint8_t slot) {
  uint8_t packet[] = {0x08, slot};
  writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet);
  uint8_t len = getReply(packet);
 Â
  if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET))
    return -1;
  return packet[1];
}
uint8_t Adafruit_Fingerprint::downloadImageToCharBuf(uint8_t slot) {
  uint8_t packet[] = {0x09, slot};
  writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet);
  uint8_t len = getReply(packet);
 Â
  if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET))
    return -1;
  return packet[1];
}
uint8_t Adafruit_Fingerprint::loadModel1(uint16_t id, uint8_t slot) {
  uint8_t packet[] = {FINGERPRINT_LOAD, slot, id >> 8, id & 0xFF};
  writePacket(theAddress, FINGERPRINT_COMMANDPACKET, sizeof(packet)+2, packet);
  uint8_t len = getReply(packet);
 Â
  if ((len != 1) && (packet[0] != FINGERPRINT_ACKPACKET))
    return -1;
  return packet[1];
}