Sprintf und nrf24 schiessen MEGA ab? / UNO funktioniert

über die Größe der Binärdatei:

nrf24_sender_test.ino.with_bootloader.hex
UBUNTU und Windows jeweils beide gleich.
MEGA: 43.988 Bytes
UNO: 22.924 Bytes

Also da hängt es nicht.
Am Aufbau mit dem MEGA auch nicht. Zwei komplett unterschiedliche Boards.
Einmal die Version ARDUINO MEGA2560 mit 16u USB-Connector, einmal die Version MEGA2560 Pro mit CH340G Connector (https://joy-it.net/files/files/Produkte/ARD_MEGA2650PRO/ARD-Mega2560Pro_01.png)

wo ist der Quellcode von nrf24_sender_test.ino.with_bootloader.hex
Ich kann es mit macOS X versuchen

1 Like

Oben das ino:

(Das zweite CODE-Tag)
Meine Übersetzung als zip anbei.
nrf24_sender_test.ino.zip (51,1 KB)

mit dem SENDESKETCH Programm von Post #60

Mac OS X 10.15.7 + IDE 1.8.12

UNO
ls -als sketch_jun08e.ino.with_bootloader.hex
--> 21932 Bytes

MEGA
ls -als sketch_jun08e.ino.with_bootloader.hex
--> 41792 Bytes

1 Like

Hm. Warte....
[edit]
Sieht bei mir auf dem Windows-System genauso aus, mit 1.8.12...
arduino_build_388995.zip (51,5 KB)

Moment mal - da geht was...

Das ist ja ein Unding!

Mit der 1.8.12 gehts! (Windows)
Tja... aber nur solange wie auch da das #DEBUG_SERIAL nicht aktiviert ist.

Mit der 1.8.15 gehts nicht (Selber Code c&p aus dem einen in das andere Fenster)
Wenn das DEBUG_SERIAL deaktiviert ist.

Ok. Dann suche ich jetzt [nicht mehr] jede andere Version auch noch durch.

Jetzt muss ich das nur nochmal in den anderen Codes probieren.
Dauert aber... ...bis Ende der Woche.

:wink: Viel Glück

Ja... das brauch ich.

Kannst Du mal bitte den folgenden Sketch auf einem MEGA laufen lassen?

// Einbinden NRFSender
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
// Ende NRF Sender

const uint8_t anzahlFelder = 15;
const char datensatz[anzahlFelder][30] = {"BRZ:15,015;" , "BRF:Paul Mustermann;", "BRS:4;", "AR1:0;", "RZ1:0,000;", "F1:Friedhelm Busch;", "AR2:0;", "RZ2:0,000;", "F2:Max Jägermeister;", "AR3:0;", "RZ3:0,000;", "F3:Paul Mustermann;", "AR4:0;", "RZ4:0,000;", "F4:Thorsten Hesse;"};

// Vorgaben:
const int spuren = 4;          // Anzahl Spuren

// Für den Sender:
const byte cePin = 9;
const byte csPin = 7;
const byte pipeAddr[] = "00001";
const byte channel = 11;       // Funkkanal => vorher ggfls. freien Bereich suchen

const byte charNum = 26;       // max Anzahl Zeichen (derzeit Fahrername (25+1))
const byte maxPSize = 32;      // maximale Anzahl Zeichen, die mit einem Mal versandt werden können

// AR - RZ - F werden mehrere Datensätze
unsigned int AR[spuren + 1];   // Runden in der Spur
unsigned int RZvk[spuren + 1]; // Rundenzeit Vorkomma in der Spur
unsigned int RZnk[spuren + 1]; // Rundenzeit Nachkomma in der Spur
char F[spuren + 1][charNum];   // Fahrername in der Spur
// Ende Vorgaben Umsetzung Daten einlesen


bool ausgabe = false;          // Wartet auf Vollständigkeit für Ausgabe
bool sendeDaten = false;       //

RF24 radio(cePin, csPin);

void setup()
{
  Serial.begin(115200);        // Serieller Monitor
  Serial.println(F("Start..."));
  Serial1.begin(19200);        // Eingang der Daten sicher getestet von 9600 - 115200
  pinMode(53, OUTPUT);
//  Serial.println(F("MEGA"));
  radio.begin();
  radio.setChannel(channel);
  radio.setPALevel(RF24_PA_LOW);    // Signalleistung
  radio.setDataRate(RF24_1MBPS);    // Geschwindigkeit
  radio.enableDynamicPayloads();    // unterschiedliche Größen
  radio.openWritingPipe(pipeAddr);  // Auf was die anderen hören müssen...
  radio.setAutoAck(0);              // senden ohne auf Antwort zu warten
  radio.stopListening();            // will nicht empfangen...
  // Setup Sender Ende
}

void loop()
{
  readSerial();
  serMon();
}

void readSerial()
{
  static char buf[30] = {0};
  for (uint8_t i = 0; i < anzahlFelder; i++)
  {
    memcpy(buf, datensatz[i], sizeof(datensatz[i]));
    teileBuf(buf);
    memset(buf, 0, sizeof(buf));
  }
}

void teileBuf(char *buf)               // Teilt den (Feld)Puffer
{
  //Serial.println(buf);
  bool istGleich = true;               // Merker letzter/aktueller Wert
  char *c;                             // Teilstring
  char lokalBuf[charNum] = {0};       // Zwischenspeicher für Vergleich (Zeichenkette) und Senden
  unsigned int lokalInt = 0;           // Zwischenspeicher für Vergleich (Zahl)
  c = strtok(buf, ":");                // Übernehme bis Trennzeichen

  if (!strncmp(c, "BRZ", 3))           // Vergleich auf Feldname
  {
    unsigned int x = 0;
    lokalInt = atoi(strtok(NULL, ","));// Erste Zahl - Trenner ist ,
    if (RZvk[x] != lokalInt)           // bisheriger Wert ist anders?
    {
      RZvk[x] = lokalInt;              // dann setze den Wert
      istGleich = false;               // merke, das neuer Wert gesetzt
    }
    lokalInt = atoi(strtok(NULL, ","));// zweite Zahl

    if (RZnk[x] != lokalInt)           // wie vor...
    {
      RZnk[x] = lokalInt;
      istGleich = false;
    }
    if (!istGleich)                    // Neue Daten bekommen?
    {
      // sende Daten!
      memset(lokalBuf, 0, sizeof(lokalBuf));
      // sprintf(lokalBuf, "BRZ %i %i", RZvk[x], RZnk[x]);
      Serial.println(lokalBuf);
      //sendData(lokalBuf);
      istGleich = true;                // setze Merker zurück
    }
  }
  else if (!strncmp(c, "BRF", 3))
  {
    strcpy(lokalBuf, strtok(NULL, ":"));    // Fahrername - Trenner ist :
    if (F[0] != lokalBuf)
    {
      memmove(F[0], lokalBuf, sizeof(lokalBuf));
      //sende Daten!
    }
  }
  else if (!strncmp(c, "BRS", 3))
  {
    lokalInt = atoi(strtok(NULL, ":"));     // Zahl
    if (AR[0] != lokalInt)
    {
      AR[0] = lokalInt;
      //sende Daten
    }
  }
  else if (!strncmp(c, "AR", 2))
  {
    unsigned int x = c[2] - '0';
    lokalInt = atoi(strtok(NULL, ":"));
    if (AR[x] != lokalInt)
    {
      AR[x] = lokalInt;
      // sende Daten!
    }

  }
  else if (!strncmp(c, "RZ", 2))
  {
    unsigned int x = c[2] - '0';
    lokalInt = atoi(strtok(NULL, ","));
    if (RZvk[x] != lokalInt)
    {
      RZvk[x] = lokalInt;
      istGleich = false;
    }
    lokalInt = atoi(strtok(NULL, ","));


    if (RZnk[x] != lokalInt)
    {
      RZnk[x] = lokalInt;
      istGleich = false;
    }
    if (!istGleich)
    {
      // sende Daten!

      istGleich = true;
    }
  }
  else if (!strncmp(c, "F", 1))
  {
    unsigned int x = c[1] - '0';
    strcpy(lokalBuf, strtok(NULL, ":"));
    if (F[x] != lokalBuf)
    {
      memmove(F[x], lokalBuf, sizeof(lokalBuf));
      //sende Daten
    }
    if (x == spuren)               // Datensatz endet mit Fahrernamen in höchster Spur
    {
      ausgabe = true;                  // Freigabe für SerMon
      sendeDaten = true;               // Freigabe Datensatz senden
    }
  }
}

void serMon()
{
  static unsigned long lastmillis = 0;
  const unsigned long intervall = 5000;

  if (ausgabe == true && (millis() - lastmillis) > intervall) // Wenn Ausgabe frei
  {
    lastmillis += intervall;
    ausgabe = false;
    Serial.println();   // Umbruch noch eingefügt
    Serial.print(F("BRS: "));  Serial.print(AR[0]);
    Serial.print(F(" BRZ: ")); Serial.print(RZvk[0]); Serial.print(F(" - ")); Serial.print(RZnk[0]);
    Serial.print(F(" BRF: ")); Serial.println(F[0]);
    Serial.println();

    for (unsigned int i = 1; i <= spuren; i++)
    {
      Serial.print("AR"); Serial.print(i); Serial.print(": "); Serial.print (AR[i]);
      Serial.print(F(" RZ")); Serial.print(i); Serial.print(": "); Serial.print(RZvk[i]); Serial.print(F(" - ")); Serial.print(RZnk[i]);
      Serial.print(" F"); Serial.print(i); Serial.print(": "); Serial.println(F[i]);
    }
    Serial.println();
  }
}

void sendData(char *sendbuffer)
{
  //radio.write(sendbuffer, sizeof(sendbuffer));
  Serial.println(sendbuffer);
}

Der gibt fehlerfrei alle 5 Sekunden auf dem Seriellen Monitor eine Ausgabe.

Wenn das geht, dann entferne mal den Kommentar in Zeile 41:

//  Serial.println(F("MEGA"));

Lade den Sketch hoch.
Ändert sich die Ausgabe?

Danke!

  • mit dem Kommentar
Start...


BRS: 4 BRZ: 15 - 15 BRF: Paul Mustermann;

AR1: 0 RZ1: 0 - 0 F1: Friedhelm Busch;
AR2: 0 RZ2: 0 - 0 F2: Max Jägermeister;
AR3: 0 RZ3: 0 - 0 F3: Paul Mustermann;
AR4: 0 RZ4: 0 - 0 F4: Thorsten Hesse;


BRS: 4 BRZ: 15 - 15 BRF: Paul Mustermann;

AR1: 0 RZ1: 0 - 0 F1: Friedhelm Busch;
AR2: 0 RZ2: 0 - 0 F2: Max Jägermeister;
AR3: 0 RZ3: 0 - 0 F3: Paul Mustermann;
AR4: 0 RZ4: 0 - 0 F4: Thorsten Hesse;
  • mit entferntem Kommentar
Start...
MEGA


BRS: 4 BRZ: 15 - 15 BRF: Paul Mustermann;

AR1: 0 RZ1: 0 - 0 F1: Friedhelm Busch;
AR2: 0 RZ2: 0 - 0 F2: Max Jägermeister;
AR3: 0 RZ3: 0 - 0 F3: Paul Mustermann;
AR4: 0 RZ4: 0 - 0 F4: Thorsten Hesse;


BRS: 4 BRZ: 15 - 15 BRF: Paul Mustermann;

AR1: 0 RZ1: 0 - 0 F1: Friedhelm Busch;
AR2: 0 RZ2: 0 - 0 F2: Max Jägermeister;
AR3: 0 RZ3: 0 - 0 F3: Paul Mustermann;
AR4: 0 RZ4: 0 - 0 F4: Thorsten Hesse;

soll ich etwas anderes sehen?
(Ich habe Ihre Pufferbehandlung nicht auf Überlauf überprüft)

alles gut.
Jetzt entferne mal in der RF24_config den Kommentar vor
#define SERIAL_DEBUG
setze erstmal den Kommentar im Sketch wieder vor den Mega.
Nach dem hochladen sollte das funktionieren wie bisher.
Wenn jetzt die Ausgabe MEGA wieder aktiviert wird, schmiert mir das Board ab. Bei Dir auch?

Ich habe #define SERIAL_DEBUG aktiviert

Ich habe auch das Setup () geändert:

//#define DEBUGTESTMEGA
//#define DEBUGTEST
void setup()
{
  Serial.begin(115200);        // Serieller Monitor
  Serial.println(F("Start..."));
  Serial1.begin(19200);        // Eingang der Daten sicher getestet von 9600 - 115200
  pinMode(53, OUTPUT);
#ifdef DEBUGTESTMEGA
  Serial.println(F("MEGA"));
#endif
  radio.begin();
#ifdef DEBUGTEST
  Serial.println(F("1"));
#endif
  radio.setChannel(channel);
#ifdef DEBUGTEST
  Serial.println(F("1"));
#endif
  radio.setPALevel(RF24_PA_LOW);    // Signalleistung
#ifdef DEBUGTEST
  Serial.println(F("2"));
#endif
  radio.setDataRate(RF24_1MBPS);    // Geschwindigkeit
#ifdef DEBUGTEST
  Serial.println(F("3"));
#endif
  radio.enableDynamicPayloads();    // unterschiedliche Größen
#ifdef DEBUGTEST
  Serial.println(F("4"));
#endif
  radio.openWritingPipe(pipeAddr);  // Auf was die anderen hören müssen...
#ifdef DEBUGTEST
  Serial.println(F("5"));
#endif
  radio.setAutoAck(0);              // senden ohne auf Antwort zu warten
#ifdef DEBUGTEST
  Serial.println(F("6"));
#endif
  radio.stopListening();            // will nicht empfangen...
  // Setup Sender Ende
}

und ich habe die 4 möglichen Debugs getestet und Das funktioniert nicht

#define DEBUGTESTMEGA
//#define DEBUGTEST

Meine erste Vermutung ist jedoch, dass Sie später einen Fehler in der Speicherverwaltung haben und dieser nur von Zeit zu Zeit aufgrund von Stack-Abhängigkeiten oder der Position von Variablen im Speicher auftaucht.

Dann würde das nur in dem Sketch passieren.

Mit eingeschaltetem SERIAL_DEBUG geht auch der Sketch aus #6 nicht.
Auch Deiner aus #17 geht dann nicht.

Das Leck muss IMHO irgendwo in der Lib liegen.
Auf einem UNO / Pro MINI funktioniert es im Übrigen fehlerfrei.

das Problem war einfach ( :scream: :man_facepalming:) ... (wenn Sie den Debug-Modus aktivieren möchten ...)

Mir ist gerade aufgefallen, dass deine Sketch print.h nicht enthält und auch nicht aktiviert ...

Fügen Sie #include <printf.h> am Anfang hinzu und fügen Sie printf_begin(); in setup()

es funktioniert fehlerfrei

1 Like

Du bist mein Held!
:trophy: :trophy: :trophy:

:wink: das hat Spaß gemacht