Uno R4 Minima SoftwareSerial error

I'm getting this error and can't find any information on how to get rid of it. I did see the topic on the UNO R4 WiFi but couldn't figure out how to relate it to my specific board.

error: 'class SoftwareSerial' has no member named 'listen' ssrfid.listen();

The project is to try to code a 125khz RFID and tags to work with a servo motor to open a lid on a box. while any other is denied. I am a beginner so please be patient with me on learning.

Thanks for any help

Hardware:
UNO R4 Minima
HiLetgo RFID RDM6300 125KHZ
125khz key fobs
SG92R 9g Micro Servo Motor

The implementation of SoftwareSerial in the Renesas Uno core does not include the listen method.

Your code, which you did not show, may have been written for another board that uses a different core, one in which that core's implementation of SoftwareSerial does include that method.

I can post the code. I just didn’t know if it was actually needed. My apologies.

This is the sample code that I started with . I was removing pieces I didn’t need like the buzzer. Etc

RDM6300-125KHz-RFID
  modified on 20 Jan 2020
  by Amir Mohammad Shojaee @ Electropeak
  Home

  based on www.mschoeffler.de Arduino Examples
*/

#include <SoftwareSerial.h>

const int BUFFER_SIZE = 14; // RFID DATA FRAME FORMAT: 1byte head (value: 2), 10byte data (2byte version + 8byte tag), 2byte checksum, 1byte tail (value: 3)
const int DATA_SIZE = 10; // 10byte data (2byte version + 8byte tag)
const int DATA_VERSION_SIZE = 2; // 2byte version (actual meaning of these two bytes may vary)
const int DATA_TAG_SIZE = 8; // 8byte tag
const int CHECKSUM_SIZE = 2; // 2byte checksum

long lasttag;

SoftwareSerial ssrfid = SoftwareSerial(10,11); 

uint8_t buffer[BUFFER_SIZE]; // used to store an incoming data frame 
int buffer_index = 0;
int buzzer = 13;

void setup() {
 Serial.begin(9600); 
 pinMode(buzzer, OUTPUT);
 ssrfid.begin(9600);
 ssrfid.listen(); 
 
 //Serial.println(" INIT DONE");
}

void loop() {
  if (ssrfid.available() > 0){
    bool call_extract_tag = false;
    
    int ssvalue = ssrfid.read(); // read 
    if (ssvalue == -1) { // no data was read
      return;
    }

    if (ssvalue == 2) { // RDM630/RDM6300 found a tag => tag incoming 
      buffer_index = 0;
    } else if (ssvalue == 3) { // tag has been fully transmitted       
      call_extract_tag = true; // extract tag at the end of the function call
    }

    if (buffer_index >= BUFFER_SIZE) { // checking for a buffer overflow (It's very unlikely that an buffer overflow comes up!)
      Serial.println("Error: Buffer overflow detected! ");
      return;
    }
    
    buffer[buffer_index++] = ssvalue; // everything is alright => copy current value to buffer

    if (call_extract_tag == true) {
      if (buffer_index == BUFFER_SIZE) {
        unsigned tag = extract_tag();
      } else { // something is wrong... start again looking for preamble (value: 2)
        buffer_index = 0;
        return;
      }
    }    
  }    
}

unsigned extract_tag() {
    uint8_t msg_head = buffer[0];
    uint8_t *msg_data = buffer + 1; // 10 byte => data contains 2byte version + 8byte tag
    uint8_t *msg_data_version = msg_data;
    uint8_t *msg_data_tag = msg_data + 2;
    uint8_t *msg_checksum = buffer + 11; // 2 byte
    uint8_t msg_tail = buffer[13];

    // print message that was sent from RDM630/RDM6300
    //Serial.println("--------");

    //Serial.print("Message-Head: ");
    //Serial.println(msg_head);

    //Serial.println("Message-Data (HEX): ");
    for (int i = 0; i < DATA_VERSION_SIZE; ++i) {
      //Serial.print(char(msg_data_version[i]));
    }
    //Serial.println(" (version)");
    for (int i = 0; i < DATA_TAG_SIZE; ++i) {
      //Serial.print(char(msg_data_tag[i]));
    }
    //Serial.println(" (tag)");

    //Serial.print("Message-Checksum (HEX): ");
    for (int i = 0; i < CHECKSUM_SIZE; ++i) {
      //Serial.print(char(msg_checksum[i]));
    }
    //Serial.println("");

    //Serial.print("Message-Tail: ");
    //Serial.println(msg_tail);

    //Serial.println("--");

    long tag = hexstr_to_value(msg_data_tag, DATA_TAG_SIZE);
    if(tag == lasttag){
      
    }
    else{
      Serial.print("Extracted Tag: ");
      Serial.println(tag);
      digitalWrite(buzzer, HIGH);
      delay(100);
      digitalWrite(buzzer, LOW);
     
      //Serial.println("");
    //Serial.println("--------");
    //delay(500);
    }
    
    
    lasttag = tag;
    
    long checksum = 0;
    for (int i = 0; i < DATA_SIZE; i+= CHECKSUM_SIZE) {
      long val = hexstr_to_value(msg_data + i, CHECKSUM_SIZE);
      checksum ^= val;
    }
    //Serial.print("Extracted Checksum (HEX): ");
    //Serial.print(checksum, HEX);
    if (checksum == hexstr_to_value(msg_checksum, CHECKSUM_SIZE)) { // compare calculated checksum to retrieved checksum
      //Serial.print(" (OK)"); // calculated checksum corresponds to transmitted checksum!
    } else {
      //Serial.print(" (NOT OK)"); // checksums do not match
    }

    
    return tag;

}
long hexstr_to_value(char *str, unsigned int length) { // converts a hexadecimal value (encoded as ASCII string) to a numeric value
  char* copy = malloc((sizeof(char) * length) + 1); 
  memcpy(copy, str, sizeof(char) * length);
  copy[length] = '\0'; 
  // the variable "copy" is a copy of the parameter "str". "copy" has an additional '\0' element to make sure that "str" is null-terminated.
  long value = strtol(copy, NULL, 16);  // strtol converts a null-terminated string to a long value
  free(copy); // clean up 
  return value;
}

So I don’t actually need the SoftwareSerial? Well that’s nice to know thanks.

I believe this is your code, taken from https://electropeak.com/learn/interfacing-rdm6300-125khz-rfid-reader-module-with-arduino/. See the difference when you follow the forum's request to "Use code tags to format code for the forum"? It's right there in your reply.

 /*
  RDM6300-125KHz-RFID
  modified on 20 Jan 2020
  by Amir Mohammad Shojaee @ Electropeak
  Home

  based on www.mschoeffler.de Arduino Examples
*/

#include <SoftwareSerial.h>

const int BUFFER_SIZE = 14; // RFID DATA FRAME FORMAT: 1byte head (value: 2), 10byte data (2byte version + 8byte tag), 2byte checksum, 1byte tail (value: 3)
const int DATA_SIZE = 10; // 10byte data (2byte version + 8byte tag)
const int DATA_VERSION_SIZE = 2; // 2byte version (actual meaning of these two bytes may vary)
const int DATA_TAG_SIZE = 8; // 8byte tag
const int CHECKSUM_SIZE = 2; // 2byte checksum

SoftwareSerial ssrfid = SoftwareSerial(6,8); 

uint8_t buffer[BUFFER_SIZE]; // used to store an incoming data frame 
int buffer_index = 0;

void setup() {
 Serial.begin(9600); 
 
 ssrfid.begin(9600);
 ssrfid.listen(); 
 
 Serial.println(" INIT DONE");
}

void loop() {
  if (ssrfid.available() > 0){
    bool call_extract_tag = false;
    
    int ssvalue = ssrfid.read(); // read 
    if (ssvalue == -1) { // no data was read
      return;
    }

    if (ssvalue == 2) { // RDM630/RDM6300 found a tag => tag incoming 
      buffer_index = 0;
    } else if (ssvalue == 3) { // tag has been fully transmitted       
      call_extract_tag = true; // extract tag at the end of the function call
    }

    if (buffer_index >= BUFFER_SIZE) { // checking for a buffer overflow (It's very unlikely that an buffer overflow comes up!)
      Serial.println("Error: Buffer overflow detected! ");
      return;
    }
    
    buffer[buffer_index++] = ssvalue; // everything is alright => copy current value to buffer

    if (call_extract_tag == true) {
      if (buffer_index == BUFFER_SIZE) {
        unsigned tag = extract_tag();
      } else { // something is wrong... start again looking for preamble (value: 2)
        buffer_index = 0;
        return;
      }
    }    
  }    
}

unsigned extract_tag() {
    uint8_t msg_head = buffer[0];
    uint8_t *msg_data = buffer + 1; // 10 byte => data contains 2byte version + 8byte tag
    uint8_t *msg_data_version = msg_data;
    uint8_t *msg_data_tag = msg_data + 2;
    uint8_t *msg_checksum = buffer + 11; // 2 byte
    uint8_t msg_tail = buffer[13];

    // print message that was sent from RDM630/RDM6300
    Serial.println("--------");

    Serial.print("Message-Head: ");
    Serial.println(msg_head);

    Serial.println("Message-Data (HEX): ");
    for (int i = 0; i < DATA_VERSION_SIZE; ++i) {
      Serial.print(char(msg_data_version[i]));
    }
    Serial.println(" (version)");
    for (int i = 0; i < DATA_TAG_SIZE; ++i) {
      Serial.print(char(msg_data_tag[i]));
    }
    Serial.println(" (tag)");

    Serial.print("Message-Checksum (HEX): ");
    for (int i = 0; i < CHECKSUM_SIZE; ++i) {
      Serial.print(char(msg_checksum[i]));
    }
    Serial.println("");

    Serial.print("Message-Tail: ");
    Serial.println(msg_tail);

    Serial.println("--");

    long tag = hexstr_to_value(msg_data_tag, DATA_TAG_SIZE);
    Serial.print("Extracted Tag: ");
    Serial.println(tag);

    long checksum = 0;
    for (int i = 0; i < DATA_SIZE; i+= CHECKSUM_SIZE) {
      long val = hexstr_to_value(msg_data + i, CHECKSUM_SIZE);
      checksum ^= val;
    }
    Serial.print("Extracted Checksum (HEX): ");
    Serial.print(checksum, HEX);
    if (checksum == hexstr_to_value(msg_checksum, CHECKSUM_SIZE)) { // compare calculated checksum to retrieved checksum
      Serial.print(" (OK)"); // calculated checksum corresponds to transmitted checksum!
    } else {
      Serial.print(" (NOT OK)"); // checksums do not match
    }

    Serial.println("");
    Serial.println("--------");

    return tag;

}
long hexstr_to_value(char *str, unsigned int length) { // converts a hexadecimal value (encoded as ASCII string) to a numeric value
  char* copy = malloc((sizeof(char) * length) + 1); 
  memcpy(copy, str, sizeof(char) * length);
  copy[length] = '\0'; 
  // the variable "copy" is a copy of the parameter "str". "copy" has an additional '\0' element to make sure that "str" is null-terminated.
  long value = strtol(copy, NULL, 16);  // strtol converts a null-terminated string to a long value
  free(copy); // clean up 
  return value;
}

As I suspected, this sketch is for an Uno R3, and the SoftwareSerial library included with that core. The R4 uses a different processor, and a different core, and its implementation of SoftwareSerial is different. Code written for one board is not always 100% compatible with another. (Some would say when discussing using R3 code on the R4 that it's hardly ever compatible, but that might be a bit harsh.)

You'll either have to modify the example to follow the R4's SoftwareSerial library, or, as @Delta_G suggested, get rid of SoftwareSerial entirely and use the extra hardware serial port the R4 provides.

Thank you for your help. Seems my SoftwareSerial error has gone. Now to battle everthing else lol. Thanks again