Dear forum member,
This is my first help message here after 2 days of deep work on the RFID M7E reader and an ESP32C6.
For you understanding I am not a tech guy so I used AI to help me write the configuration.
I tried different code but I have many issues even with the smallest one.
Here for example, with this code:
#include <HardwareSerial.h>
HardwareSerial SerialRFID(0); // UART0 : RX=GPIO1, TX=GPIO2
void setup() {
Serial.begin(115200);
SerialRFID.begin(38400, SERIAL_8N1, 1, 2); // 115200 bauds
Serial.println("Test minimal : attente de données du M7HE Octo...");
}
void loop() {
if (SerialRFID.available()) {
byte data = SerialRFID.read();
Serial.print("Donnée reçue: 0x");
Serial.println(data, HEX);
}
}
I get only this kind of data:
16:44:41.078 → Donnée reçue: 0x62
16:44:41.078 → Donnée reçue: 0xFF
16:44:41.241 → Donnée reçue: 0x7D
16:44:43.611 → Donnée reçue: 0xFC
16:44:43.908 → Donnée reçue: 0x6F
16:44:47.568 → Donnée reçue: 0x0
16:44:47.568 → Donnée reçue: 0xFF
How can. I get the Tag ID + RSSI + Counter + Timestamp?
I also tried this but I have no answer at all:
#include <HardwareSerial.h>
#include "SparkFun_UHF_RFID_Reader.h" // Librairie SparkFun
// Déclarer l'UART pour le M7HE Octo (UART0 : RX=GPIO1, TX=GPIO2)
HardwareSerial rfidSerial(0);
// Créer une instance du module RFID
RFID rfidModule;
// Définir le type de module (M7E HECTO)
#define moduleType ThingMagic_M7E_HECTO
// Baud rate pour le M7HE Octo
#define rfidBaud 38400
// Buffer pour le mode binaire (fallback)
const int BUFFER_SIZE = 64;
byte binaryBuffer[BUFFER_SIZE];
int binaryBufferIndex = 0;
void setup() {
Serial.begin(115200); // Serial Monitor (PC)
while (!Serial); // Attendre que le port série soit prêt
// Initialiser l'UART pour le M7HE Octo
rfidSerial.begin(rfidBaud, SERIAL_8N1, 1, 2); // RX=GPIO1, TX=GPIO2
// Forcer le mode texte et réinitialiser le module
Serial.println("⚙️ Configuration du module en mode texte...");
rfidSerial.println("~CONFIG:TEXT,ON"); // Forcer le mode texte
delay(500);
rfidSerial.println("~RESET"); // Réinitialiser le module
delay(1000);
// Vider le buffer
while (rfidSerial.available()) {
rfidSerial.read();
}
// Configurer le module RFID avec la librairie SparkFun
if (setupRfidModule(rfidBaud)) {
Serial.println("✅ Module configuré en mode texte !");
rfidModule.setRegion(REGION_EUROPE); // Remplacez par votre région
rfidModule.setReadPower(500); // 5 dBm
rfidModule.startReading(); // Démarrer la lecture
} else {
Serial.println("⚠️ Échec de la configuration en mode texte. Passage en mode binaire...");
}
}
void loop() {
// Essayer de lire en mode texte (librairie SparkFun)
if (rfidModule.check() == true) {
byte responseType = rfidModule.parseResponse();
if (responseType == RESPONSE_IS_KEEPALIVE) {
Serial.println("🔍 Scanning...");
}
else if (responseType == RESPONSE_IS_TAGFOUND) {
int rssi = rfidModule.getTagRSSI();
long freq = rfidModule.getTagFreq();
long timeStamp = rfidModule.getTagTimestamp();
byte tagEPCBytes = rfidModule.getTagEPCBytes();
Serial.print("🏷️ Tag détecté | RSSI: ");
Serial.print(rssi);
Serial.print(" dBm | Fréquence: ");
Serial.print(freq);
Serial.print(" kHz | Timestamp: ");
Serial.print(timeStamp);
Serial.print(" ms | EPC: ");
for (byte x = 0; x < tagEPCBytes; x++) {
if (rfidModule.msg[31 + x] < 0x10) Serial.print("0");
Serial.print(rfidModule.msg[31 + x], HEX);
Serial.print(" ");
}
Serial.println();
}
else if (responseType == ERROR_CORRUPT_RESPONSE) {
Serial.println("⚠️ Erreur CRC (données corrompues)");
}
else if (responseType == RESPONSE_IS_HIGHRETURNLOSS) {
Serial.println("⚠️ Perte de retour élevée, vérifiez l'antenne !");
}
}
// Si le mode texte échoue, lire en mode binaire
else {
readBinaryMode();
}
}
// Fonction pour lire en mode binaire (fallback)
void readBinaryMode() {
while (rfidSerial.available() && binaryBufferIndex < BUFFER_SIZE) {
binaryBuffer[binaryBufferIndex++] = rfidSerial.read();
}
// Rechercher le motif 0xFF 0xFE (début de trame)
for (int i = 0; i < binaryBufferIndex - 1; i++) {
if (binaryBuffer[i] == 0xFF && binaryBuffer[i+1] == 0xFE) {
Serial.println("\n--- Début de trame binaire détecté ---");
Serial.print("Données brutes : ");
for (int j = i; j < min(i + 14, binaryBufferIndex); j++) {
if (binaryBuffer[j] < 0x10) Serial.print("0");
Serial.print(binaryBuffer[j], HEX);
Serial.print(" ");
}
Serial.println();
// Extraire le RSSI (supposons qu'il est à l'octet i+8)
int8_t rssi = (int8_t)binaryBuffer[i+8];
Serial.print("RSSI : ");
Serial.print(rssi);
Serial.println(" dBm");
// Extraire le Tag ID (supposons qu'il commence à i+2, longueur 8 octets)
Serial.print("Tag ID : ");
for (int j = i+2; j < i+10; j++) {
if (binaryBuffer[j] < 0x10) Serial.print("0");
Serial.print(binaryBuffer[j], HEX);
Serial.print(" ");
}
Serial.println();
// Réinitialiser le buffer
binaryBufferIndex = 0;
break;
}
}
// Réinitialiser le buffer s'il est plein
if (binaryBufferIndex >= BUFFER_SIZE) {
binaryBufferIndex = 0;
Serial.println("\nBuffer plein, réinitialisation...");
}
}
// Fonction pour configurer le module RFID (mode texte)
boolean setupRfidModule(long baudRate) {
rfidModule.begin(rfidSerial, moduleType); // Initialiser la communication
// Tester si le module est déjà configuré
rfidSerial.begin(baudRate);
delay(100);
// Ignorer les messages de démarrage
while (rfidSerial.available()) {
rfidSerial.read();
}
// Vérifier la version du module
rfidModule.getVersion();
if (rfidModule.msg[0] == ERROR_WRONG_OPCODE_RESPONSE) {
rfidModule.stopReading();
Serial.println("⚠️ Module en lecture continue. Arrêt en cours...");
delay(1500);
} else {
rfidSerial.begin(115200);
rfidModule.setBaud(baudRate);
rfidSerial.begin(baudRate);
delay(250);
}
// Tester la connexion
rfidModule.getVersion();
if (rfidModule.msg[0] != ALL_GOOD) {
return false;
}
rfidModule.setTagProtocol(); // Protocole GEN2
rfidModule.setAntennaPort(); // Ports TX/RX à 1
return true;
}
I think everything would be easier working in a text mode instead of a binary mode. How can I do that?
In addition I need to let the tag over the reader quite a long time to get an answer and to shake the tags to get the different binary data…
Thanks in advance for your help.
Have a nice day
Maxime

