Nach 3 Mysql Abfragen "Bad mojo"

Ich habe auf meinem Arduino UNO ein Ethernet und RFID Modul
Es wird mittels Mysql Connector eine Abfrage an eine Mysql db gesendet ob die RFID gespeichert ist oder nicht, und dementsprechend ausgegeben.

Soweit so gut kommt das Richtige ergebniss.
Aber nach +/- 3 Abfragen bekomme ich im Serial Monitor

Bad mojo. EOF found reading column header.
ERROR: You must read the columns first!

hier mal der Aktuelle Skatch

#include <Ethernet.h>
#include <MySQL_Connection.h>
#include <SPI.h>
#include <RFID.h>
#include <MySQL_Cursor.h>



//Ethernet Shield Konfiguration

byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0,177);

//Mysql Datenbank Konfiguration
IPAddress server_addr(192,168,0,245);  // IP of the MySQL *server* here
char user[] = "arduino";              // MySQL user login username
char password[] = "123456";        // MySQL user login password


EthernetClient client;
MySQL_Connection conn((Client *)&client);

//Pin belegung für das RFID Shield
#define SS_PIN 8 //SDA 
#define RST_PIN 9 //RST

RFID rfid(SS_PIN, RST_PIN);

void setup()
{
  Serial.begin(115200); // Aufbau der Seriellen verbindung für den Monitor
  SPI.begin();
  rfid.init();
  Ethernet.begin(mac_addr,ip); // Starten der IP Configuration
  
  
  Serial.println("Connecting...");
  if (conn.connect(server_addr, 3306, user, password)) {
    delay(1000);
    
    Serial.println("Verbindung hergestellt.");
  }
  else
  {
    Serial.println("Connection failed.");
  }
 
}


void soft_reset() {
  asm volatile("jmp 0");  
}  

int num_fails;
void loop() {
  
//Mysql Verbindung Prüfen und bei bedarf den Arduino Neu Starten
    if(conn.connected()){
      num_fails = 0;  
    }
    else
    {
      conn.close(); //Verbindung wird geschlossen
      Serial.println("neue Verbindung");
      if (conn.connect(server_addr, 3306, user, password)){
        delay(500);
        num_fails++;
       
        if(num_fails == 5){
          delay(2000);
          Serial.println("Reset");
          soft_reset();
          }
        }
      }

row_values *row = NULL;


  if (rfid.isCard() && rfid.readCardSerial()) {
    String serial = parseId(rfid);
    
      Serial.print("RFID Nummer: ");
      Serial.println(serial);
      
      
      //EIntrag in die Mysql Datenbank
      Serial.println("Recording data.");
     
      //Eintrag der RFID in die Datenbank
      char serialArray[64];
      char INSERT_SQL[128];


      serial.toCharArray(serialArray, serial.length()+1); 
      sprintf (INSERT_SQL, "INSERT INTO arduino.rfid_log (message) VALUES ('%s')",  serialArray);
      MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
      // Execute the query
      cur_mem->execute(INSERT_SQL);


      //Abfrage ob die RFID in der Datenbank vorhanden ist
      char QUERY_POP[128];
      sprintf(QUERY_POP,"SELECT member_rfid from arduino.member WHERE member_rfid = '%s'", serialArray);

      MySQL_Cursor *cur_mem_1 = new MySQL_Cursor(&conn);
      
      cur_mem_1->execute(QUERY_POP);
      

      // Fetch the columns (required) but we don't use them.
      column_names *cols = cur_mem_1->get_columns();
        
      // Read the row (we are only expecting one)
        row = cur_mem_1->get_next_row();
          if (row == NULL) {
              Serial.println("Kein User gefunden!");
              delay(500);
            // soft_reset();
          } else {
              Serial.println("Ein User gefunden!");
              delay(500);
              //soft_reset();
              
          }
          
        delete cur_mem_1;
        delete cur_mem;
      
  }


  rfid.halt();
 
}

String parseId(RFID rfid) {
  String result = "";
  int position = 0;
  //Anzahl der Bytes die ausgelesen werden sollen
  for (position = 0; position <= 3; position++) {
    String pos = getid(rfid, position);
    result = result + pos;
  }
  result.toUpperCase();
  return result;
}

String getid(RFID rfid, int position) {
  return String(rfid.serNum[position], HEX);
}

und hier die

MySql

CREATE TABLE `member` (
  `id` int(255) NOT NULL,
  `member_rfid` varchar(15) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `rfid_log` (
  `id` int(255) NOT NULL,
  `message` varchar(128) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Eventuell jemand von euch einen Tip was ich da machen kann.
Es wirkt sich jetzt nicht extrem auf die einsatz funktion aus... aber lieber wäre mir natürlich ihne Fehlermeldung.

LG

Stimmt irgendwas mit den Größen nicht?

Eigenartig, das scheint mit rfid-Readern zusammenzuhängen oder es wird die selbe Quelle benutzt.... :wink:

Das ist kein Reset.

Was meinst du mit der Größe?

Also er startet neu wenn die Funktion aufgerufen wird....
Wie macht man es dann deiner meinung nach anders/richtig?

Nöö...
Es wird nur die Adresse angesprungen.
Eine echter Reset würde auch die internen Register auf "neu" stellen.

Gar nicht.
Es ist bei den AVR weder vorgesehen, mit Bordmitteln möglich, noch notwendig.

Du könntest den WDT dafür missbrauchen, absichtlich einen Reset zu erzwingen.
Aber es ist und bleibt ein Missbrauch, dirty Häck, und sicherlich auch ein Irrweg.

Feldgrößen.
Bist Du dem issue gefolgt?
Hast Du gemacht, was da drin steht?
Mit welchem Ergebnis?

hmm ok... dann schon mal vielen dank für den Hinweis :slight_smile:
Ich bin was Arduino angeht noch ordentlich grün hinter den Ohren und freue mich über alles was ich noch lernen kann

LG

Hi... tut mir leid aber ich hab ehrlich keinen plan von was du redest.
Ich bin so wie ich es Combie schon geantwortet habe ganz neu im Arduino sektor und arbeite mich erst nach und nach in die Marterie rein.

Von daher kann ich noch mit vielen begriffen nichts anfangen.

von daher wäre es für mich schon mal hilfreich wenn ich herrausfinden könnte was die meldung

Bad mojo. EOF found reading column header.
ERROR: You must read the columns first!

bedeutet und warum sie erst nach einigen abfragen kommt und nicht öffters?!

LG

Was hindert Dich daran, da oben auf den Link zu klicken und nachzulesen, was chuckbell dort empfohlen hat? Das ist 1:1 die selbe Fehlermeldung und offensichtlich 1:1 das gleiche Problem.

Vielleicht gehört die Zeile an eine andere Stelle als bei Dir eingetragen.
Um das rauszufinden, müsstest Du jeweils serielle Ausgaben in Deinen Code schreiben - nach jedem Stück Codezeile, damit Du weisst, wo es auslöst.

Ich kann nicht mal english. Dafür gibts dann z.B. auch Übersetzer.

Ich habe mir natürlich den Link durchgelesen und bin dank google auch schon selber auf diese seite gekommen :slight_smile:

Abgesehn von der PHP API die dort beschrieben wird gibts den hinweis das

column_names *cols = cur_mem->get_columns();

Eingefügt werden sollte. Was ja bei mir ja schon vorhanden ist.

      //Abfrage ob die RFID in der Datenbank vorhanden ist
      char QUERY_POP[130];
      sprintf(QUERY_POP,"SELECT member_rfid from arduino.member WHERE member_rfid = '%s'", serialArray);

      MySQL_Cursor *cur_mem_1 = new MySQL_Cursor(&conn);

      
      cur_mem_1->execute(QUERY_POP);
      
      // Fetch the columns (required) but we don't use them.
      column_names *cols = cur_mem_1->get_columns();
      
      // Read the row (we are only expecting one)
        row = cur_mem_1->get_next_row();

So wie ich das sehe ist sie auch genau da wo sie hin sollte.
Es werden sich zuert die cols und dann die rows vorgenommen.

Was man ja aus der Fehlermeldung rauslesen kann werden warum auch immer
hier und da zuerst die Rows und dann die cols abgefragt. Was dann zu der fehlermeldung führt

Bad mojo. EOF found reading column header.
ERROR: You must read the columns first!


LG

Das weiss ich im Moment noch nicht.
Schreib doch mal ab

//Eintrag der RFID in die Datenbank

nach jeder Codezeile ein

Serial.println('1');

bis

    if (row == NULL)

und entweder Du zählst selber oder lässt das schon richtig ausgeben.
Und dann schau an welcher Stelle der Abbruich kommt - vielleicht kommt man auf dem Weg dahinter.

Ich kanns nur compilieren und lese:

warning: unused variable 'cols' [-Wunused-variable]
     column_names *cols = cur_mem_1->get_columns();
                   ^~~~

Ja das ich in jede Codezeile ne Serial Monitor ausgabe gemacht habe hat meine annahme das es hier sein sollte nur bestätigt.

      // Fetch the columns (required) but we don't use them.
      column_names *cols = cur_mem_1->get_columns();
     
      // Read the row (we are only expecting one)
        row = cur_mem_1->get_next_row();

Was aber noch immer nicht erklärt warum dies nicht bei jeder abfrage sondern in den meisten Fällen nach 3 geschiet

LG

Schieb mal was zwischen:

      // Fetch the columns (required) but we don't use them.
  column_names *cols = cur_mem->get_columns();
  for (int f = 0; f < cols->num_fields; f++) {
    Serial.print(cols->fields[f]->name);
    if (f < cols->num_fields-1) {
      Serial.print(',');
    }
  }

da gibt er mir natürlich "nur" die member_rfid aus

kann ich die abfrage auch irgendwie anders ausführen?
Den im grunde gehts mir nur darum ob sich die rfid in der DB befindet oder nicht.
Also im grunde zählen der einträge.

Das ist erstmal wurscht, was da ausgegeben wird.
Aber das ist das Problem. Ohne cols bekommst Du keine rows.
Die Zeile

Serial.print(cols->fields[f]->name);

drin lassen und alles andere rundrum weg. Dann das f durch eine 0 ersetzen.
Kommt was bei raus?

member_rfid

gibt der Monitor dann aus.

EDIT:
Wenn ich nun aber den chip sozusagen drauf liegen lasse so der er die abfragen serh schnell hintereinander durchführt kommt nun auch

INSERT INTO arduino.rfid_log (message) VALUES ('8C266822')

Na ist doch richtig. das ist Deine Spalte, die jetzt verwendet wird, wenn Du row abfragst.

nun ja ich hab ja auch nicht gesagt das die abfrage nicht/nie funktioniert.
Er greift ja auch auf alles richtig zu... nur eben nach +/- 3 Abfragen kommt die meldung "Bad Mojo etc"

Jetzt auch noch?