Mit CANBUS Adapter MCP 2515 empfangen und mit Bluetooth HM10 zum Handy senden

Hallo und guten Abend miteinander, der Verrückte mit der Rennbahn ist wieder da :wink:
Ich hoffe Ihr seid alle gesund und munter ins 2024 gerutscht und gut angekommen.

Für meinen Teil ist das ganz gut gelungen...apropo gelungen, der Dunlopturm hat jetzt noch 3 Bildschirme für die Zuschauer in der 1 Etage in Form von 3 Oled's 0,96" bekommen.
Angezeigt werden neben dem alten ZDF Zeichen (War der erste Sender der die Formel 1 übertragen hatte) Werbung, bester Fahrer, Streckentemperatur, Rundenzeiten etc. Wollte nur damit sagen das ich einige Dinge auch allein gelöst bekomme, natürlich mit dem erlernten aus diesem Forum. Danke an dieser Stelle an euch Allen.

So, aber nun zum Thema. Ich habe vor die Renndaten die ich über den CANBUS(MCP2515) empfange über ein Bluetooth Modul(HM10) an ein Handy zu senden. Womit ? Mit der App remotexy. Ich finde diese App gerade als Einsteiger(mit div. Vor-Kenntnissen) als leicht zu verstehen.....

Nun kommt es zu einlese Fehler beim CANBUS sobald ich mich mit dem Handy und dem Bluetooth-Modul verbinde. Im Klartext werden die Fahrernamen willkürlich abgeschnitten, somit wird aus Jan Dürhold z.B. nur "Jan D" oder aus Werner Bolz nur "Werne" trenne ich die Verbindung zum Handy erholt sich der Empfang nach kurzer Zeit wieder und im SM sind wieder die richtigen bzw. die vollständigen Namen zu lesen. Hab auch schon mit den Geschwindigkeiten gespielt CANBUS von 50 bis 125Kbps und Bluetooth mit 9600 / 19200 mehr wollte es nicht.(Bei mehr hat sich Handy nicht mehr mit dem Modul verbunden)

Nun habe ich irgendwo im Net gelesen das memcpy schon mal ärger bereiten kann, da die Einleseroutine vom CANBUS memcpy verwendet nun die Frage, kann das sein? oder könnte ich den CANBUS auch anders einlesen?

Würde mich freuen wenn ich wieder mal Hilfe von Euch bekommen würde.

[code]
   -- Bluetooth für Race Control-II --
   Hardware:
   Mega Pro 
   https://www.amazon.de/DollaTek-ATmega2560-16AU-Intelligente-elektronische-Entwicklungsboard/dp/B07HBTSLCF/ref=sr_1_2?qid=1705339272
   
   Hailege 2pcs MCP2515 CAN Bus Module TJA1050 Receiver SPI Module AVR 
   https://www.amazon.de/MCP2515-CAN-Bus-Modul-TJA1050-Empf%C3%A4nger-Arduino/dp/B07Z1V2RTM/ref=sr_1_3?crid=12N3543T0WHZD&qid=1705339212&sprefix=mcp%202515,aps,85
 
   DSD TECH HM-10 Bluetooth 4.0 BLE iBeacon UART Modul mit 4 PIN Base Board
   https://www.amazon.de/dp/B06WGZB2N4?psc=1&ref=ppx_yo2ov_dt_b_product_details

   This source code of graphical user interface
   has been generated automatically by RemoteXY editor.
   To compile this code using RemoteXY library 3.1.11 or later version
   download by link http://remotexy.com/en/library/
   To connect using RemoteXY mobile app by link http://remotexy.com/en/download/
     - for ANDROID 4.11.4 or later version;
     - for iOS 1.9.1 or later version;

   This source code is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.
*/

//////////////////////////////////////////////
//        RemoteXY include library          //
//////////////////////////////////////////////

// RemoteXY select connection mode and include library
#define REMOTEXY_MODE__HARDSERIAL
#include <RemoteXY.h>

// RemoteXY connection settings
#define REMOTEXY_SERIAL Serial1    
#define REMOTEXY_SERIAL_SPEED 9600


// RemoteXY configurate  
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =   // 1488 bytes
  { 255,20,0,111,1,201,5,16,30,5,130,3,2,33,59,6,1,1,130,3,
  3,34,57,4,1,30,130,1,0,95,67,9,0,28,131,4,33,90,27,4,
  4,13,24,87,69,82,66,69,65,78,90,69,73,71,69,0,131,4,3,90,
  23,4,3,13,24,68,85,78,76,79,80,84,85,82,77,0,131,4,33,83,
  27,4,2,13,24,77,65,84,82,73,88,65,78,90,69,73,71,69,78,0,
  69,1,26,91,10,10,0,129,0,6,2,52,6,0,24,82,97,99,101,45,
  67,111,110,116,114,111,108,32,86,32,50,46,48,0,131,5,3,83,23,4,
  1,13,24,72,65,85,80,84,77,69,78,195,156,0,129,0,16,27,30,5,
  1,24,83,116,114,101,99,107,101,110,45,73,110,102,111,0,10,49,25,71,
  14,6,3,12,1,31,76,105,99,104,116,32,49,32,79,71,0,31,76,105,
  99,104,116,32,49,45,69,116,97,103,101,0,10,49,46,71,14,6,3,12,
  1,31,76,105,99,104,116,32,50,32,79,71,0,31,76,105,99,104,116,32,
  50,45,69,116,97,103,101,0,129,0,16,28,32,5,4,24,87,101,114,98,
  101,97,110,122,101,105,103,101,0,130,3,0,14,4,3,0,24,130,3,4,
  17,4,3,0,24,130,3,8,14,4,3,0,24,130,3,12,17,4,3,0,
  24,130,3,16,14,4,3,0,24,130,3,20,17,4,3,0,24,130,3,24,
  14,4,3,0,24,130,3,28,17,4,3,0,24,130,3,32,14,4,3,0,
  24,130,3,36,17,4,3,0,24,130,3,40,14,4,3,0,24,130,3,44,
  17,4,3,0,24,130,3,48,14,4,3,0,24,130,3,52,17,4,3,0,
  24,130,3,56,14,4,3,0,24,130,3,60,17,4,3,0,24,130,3,0,
  20,4,3,0,24,130,3,8,20,4,3,0,24,130,3,16,20,4,3,0,
  24,130,3,24,20,4,3,0,24,130,3,32,20,4,3,0,24,130,3,40,
  20,4,3,0,24,130,3,48,20,4,3,0,24,130,3,56,20,4,3,0,
  24,130,3,0,13,63,1,0,24,130,3,0,23,63,1,0,24,129,0,18,
  27,26,5,3,24,68,117,110,108,111,112,116,117,114,109,0,67,5,0,34,
  63,7,2,1,30,31,129,0,15,27,33,5,2,24,77,97,116,114,105,120,
  97,110,122,101,105,103,101,110,0,1,1,3,45,14,5,2,0,1,70,97,
  104,114,101,114,115,112,117,114,0,1,1,3,53,14,5,2,0,1,84,97,
  103,101,115,114,117,110,100,101,110,0,1,1,3,53,14,5,4,0,1,80,
  85,83,72,32,84,79,0,129,0,5,60,10,2,4,24,82,195,188,99,107,
  119,195,164,114,116,115,0,1,1,45,53,14,5,4,0,1,80,85,83,72,
  32,84,79,0,129,0,48,60,8,2,4,24,86,111,114,119,195,164,114,116,
  115,0,129,0,7,9,26,2,0,24,70,195,188,114,32,109,101,104,114,32,
  83,112,97,195,159,32,105,109,32,83,99,104,108,105,116,122,46,46,46,0,
  1,1,3,61,14,5,2,0,1,76,117,102,116,102,101,117,99,104,116,105,
  103,107,101,105,116,0,1,1,24,53,14,5,2,0,1,84,101,109,112,101,
  114,97,116,117,114,0,1,1,24,45,14,5,2,0,1,66,97,104,110,115,
  116,114,111,109,0,1,1,24,61,14,5,2,0,1,82,117,110,100,101,110,
  122,101,105,116,101,110,0,1,1,45,45,14,5,2,0,1,70,97,104,114,
  101,114,110,97,109,101,0,1,1,45,53,14,5,2,0,1,82,117,110,100,
  101,110,122,195,164,104,108,101,114,0,1,1,45,61,14,5,2,0,1,68,
  97,116,117,109,32,47,32,85,104,114,122,101,105,116,0,1,1,43,46,14,
  5,3,0,1,84,97,103,101,115,114,117,110,100,101,110,0,1,1,14,55,
  14,5,3,0,1,66,97,104,110,115,116,114,111,109,0,1,1,24,46,14,
  5,3,0,1,82,117,110,100,101,110,122,101,105,116,101,110,0,1,1,4,
  46,14,5,3,0,1,82,117,110,100,101,110,122,195,164,104,108,101,114,0,
  1,1,34,55,14,5,3,0,1,68,97,116,117,109,32,47,32,85,104,114,
  122,101,105,116,0,67,5,0,34,63,7,3,1,30,31,67,5,0,35,63,
  7,4,1,30,31,10,113,6,71,14,6,3,12,1,31,76,105,99,104,116,
  32,84,114,101,112,112,101,0,31,67,6,27,67,12,3,1,24,30,11,67,
  6,29,71,10,3,1,24,30,11,129,0,3,67,28,3,1,24,83,116,114,
  101,99,107,101,110,116,101,109,112,101,114,97,116,117,114,58,0,129,0,3,
  71,23,3,1,24,76,117,102,116,102,101,117,99,104,116,105,103,107,101,105,
  116,58,0,129,0,40,71,2,3,1,24,37,0,129,0,39,67,3,3,1,
  24,194,176,67,0,2,1,8,63,10,5,3,0,26,12,1,79,78,0,79,
  70,70,0,129,0,4,35,6,2,1,24,83,112,117,114,45,49,0,67,4,
  30,35,10,2,1,24,30,5,67,4,43,35,15,2,1,24,30,11,130,3,
  11,33,1,5,1,1,130,3,42,34,1,5,1,1,129,0,3,75,23,3,
  1,24,66,101,115,116,122,101,105,116,58,0,67,4,34,75,36,3,1,24,
  30,31,67,4,13,35,14,2,1,24,30,31,130,3,29,33,1,5,1,1,
  130,3,2,41,59,6,1,31,130,3,3,42,57,4,1,30,129,0,4,43,
  6,2,1,24,83,112,117,114,45,50,0,67,4,30,43,10,2,1,24,30,
  5,67,4,43,43,15,2,1,24,30,11,130,3,11,41,1,5,1,31,130,
  3,42,42,1,5,1,31,67,4,13,43,14,2,1,24,30,31,130,3,29,
  41,1,5,1,31,130,3,2,49,59,6,1,12,130,3,3,50,57,4,1,
  30,129,0,4,51,6,2,1,24,83,112,117,114,45,51,0,67,4,30,51,
  10,2,1,24,30,5,67,4,43,51,15,2,1,24,30,11,130,3,11,49,
  1,5,1,12,130,3,42,50,1,5,1,12,67,4,13,51,14,2,1,24,
  30,31,130,3,29,49,1,5,1,12,130,3,2,57,59,6,1,2,130,3,
  3,58,57,4,1,30,129,0,4,59,6,2,1,24,83,112,117,114,45,52,
  0,67,4,30,59,10,2,1,24,30,5,67,4,43,59,15,2,1,24,30,
  11,130,3,11,57,1,5,1,2,130,3,42,58,1,5,1,2,67,4,13,
  59,14,2,1,24,30,31,130,3,29,57,1,5,1,2,129,0,3,79,23,
  3,1,24,66,101,115,116,101,114,32,70,97,104,114,101,114,58,0,67,4,
  34,79,36,3,1,24,30,31 };
  
// this structure defines all the variables and events of your control interface 
struct {

    // input variables
  uint8_t D_7; // =1 if state is ON, else =0 
  uint8_t D_8; // =1 if state is ON, else =0 
  uint8_t M_1; // =1 if button pressed, else =0 
  uint8_t M_4; // =1 if button pressed, else =0 
  uint8_t W_1; // =1 if button pressed, else =0 
  uint8_t W_2; // =1 if button pressed, else =0 
  uint8_t M_7; // =1 if button pressed, else =0 
  uint8_t M_5; // =1 if button pressed, else =0 
  uint8_t M_2; // =1 if button pressed, else =0 
  uint8_t M_8; // =1 if button pressed, else =0 
  uint8_t M_3; // =1 if button pressed, else =0 
  uint8_t M_6; // =1 if button pressed, else =0 
  uint8_t M_9; // =1 if button pressed, else =0 
  uint8_t D_3; // =1 if button pressed, else =0 
  uint8_t D_4; // =1 if button pressed, else =0 
  uint8_t D_2; // =1 if button pressed, else =0 
  uint8_t D_1; // =1 if button pressed, else =0 
  uint8_t D_5; // =1 if button pressed, else =0 
  uint8_t D_6; // =1 if state is ON, else =0 
  uint8_t switch_1; // =1 if switch ON and =0 if OFF 

    // output variables
  int16_t sound_1; // =0 no sound, else ID of sound, =1001 for example, look sound list in app 
  char MINFO[31];  // string UTF8 end zero 
  char DINFO[31];  // string UTF8 end zero 
  char WINFO[31];  // string UTF8 end zero 
  char Temp_1[11];  // string UTF8 end zero 
  char Luft_1[11];  // string UTF8 end zero 
  char Runden_1[5];  // string UTF8 end zero 
  char Time_1[11];  // string UTF8 end zero 
  char Time_0[31];  // string UTF8 end zero 
  char Fahrer_1[31];  // string UTF8 end zero 
  char Runden_2[5];  // string UTF8 end zero 
  char Time_2[11];  // string UTF8 end zero 
  char Fahrer_2[31];  // string UTF8 end zero 
  char Runden_3[5];  // string UTF8 end zero 
  char Time_3[11];  // string UTF8 end zero 
  char Fahrer_3[31];  // string UTF8 end zero 
  char Runden_4[5];  // string UTF8 end zero 
  char Time_4[11];  // string UTF8 end zero 
  char Fahrer_4[31];  // string UTF8 end zero 
  char Fahrer_0[31];  // string UTF8 end zero 

    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0 

} RemoteXY;
#pragma pack(pop)




/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////




#include <mcp_can.h>       // https://github.com/coryjfowler/MCP_CAN_lib CAN BUS
// SCK - 52
// SI  - 51
// SO  - 50
// CS  - 53
// INT - 2
MCP_CAN CAN0(53);          // Set CS to pin 53
uint32_t id = 0x12000000 + (16 * 1);
char msg[5][30];




// Renndaten

const uint8_t charNum = 30;                         // Anzahl Buchstaben -1 für Fahrernamen
const uint8_t maxSpuren = 8;                        // Über CAN BUS eingelesen,mögliche Anzahl der Spuren
char Fahrer[maxSpuren + 1][charNum] = {0};          // Über CAN BUS eingelesen
char Fahrer_Aktuell[maxSpuren + 1][charNum] = {0};  // Vergleicher                       
uint16_t AR[maxSpuren + 1] = {0};                   // Über CAN BUS eingelesen,Runden je Spur
uint16_t RZvk[maxSpuren + 1] = {0};                 // Über CAN BUS eingelesen,Rundenzeit Vorkomma je Spur
uint16_t RZnk[maxSpuren + 1] = {0};                 // Über CAN BUS eingelesen,Rundenzeit Nachkomma je Spur
uint8_t TempVK = 0;                                 // Über CAN BUS eingelesen,Temperatur Vorkomma
uint8_t TempNK = 0;                                 // Über CAN BUS eingelesen,Temperatur Nachkomma
uint8_t LuftVK = 0;                                 // Über CAN BUS eingelesen,Luftfeuchtigkeit Vorkomma
uint8_t LuftNK = 0;                                 // Über CAN BUS eingelesen,Luftfeuchtigkeit Nachkomma
float TempFloat = 0;                                // ...erstelle Temperatur aus Vorkomma und Nachkomma als Floatzahl für remoteXY
float LuftFloat = 0;                                // ...erstelle Luftfeuchtigkeit aus Vorkomma und Nachkomma als Floatzahl für remoteXY
float Time0 = 0.000;                                // ...erstelle Rundenzeit Spur 0(Bestzeit)aus Vorkomma und Nachkomma als Floatzahl für remoteXY
float Time0_Old = 0.000;                            // ...Vergleicher ob neue Bestzeit
float Time1 = 0.000;                                // ...erstelle Rundenzeit Spur 1(Fahrer-1)aus Vorkomma und Nachkomma als Floatzahl für remoteXY
float Time1_Old = 0.000;                            // ...Vergleicher ob neue Rundenzeit Spur 1
float Time2 = 0.000;                                // ...erstelle Rundenzeit Spur 2(Fahrer-2)aus Vorkomma und Nachkomma als Floatzahl für remoteXY
float Time2_Old = 0.000;                            // ...Vergleicher ob neue Rundenzeit Spur 2
float Time3 = 0.000;                                // ...erstelle Rundenzeit Spur 3(Fahrer-3)aus Vorkomma und Nachkomma als Floatzahl für remoteXY
float Time3_Old = 0.000;                            // ...Vergleicher ob neue Rundenzeit Spur 3
float Time4 = 0.000;                                // ...erstelle Rundenzeit Spur 4(Fahrer-4)aus Vorkomma und Nachkomma als Floatzahl für remoteXY
float Time4_Old = 0.000;                            // ...Vergleicher ob neue Rundenzeit Spur 4

uint16_t ZaehlerF=0;
uint16_t ZaehlerR=0;


void setup()
{
  RemoteXY_Init ();
  Serial.begin(115200);
  
  
  // CAN BUS
  while (CAN_OK != CAN0.begin(MCP_STDEXT, CAN_50KBPS, MCP_8MHZ))  // init can bus : masks and filters disabled, baudrate, Quarz vom MCP2551
  {
    Serial.println("CAN BUS Shield init fail");                   //  CAN BUS Shield init fail
  }
  Serial.println("CAN BUS Shield init ok!");                      //  CAN BUS Shield init ok!

  CAN0.setMode(MCP_NORMAL);                                       // Change to normal mode to allow messages to be transmitted

  Serial.println("Starte.... ");
  Serial.println(" ");

}

void loop()
{
  RemoteXY_Handler ();
  leseCanBus();
}

// Funktion für Dunlopturm Displaywechsel...Auswahl wird dann über CAN Bus an den Teilnehmer gesendet
void Fernbedienung(uint8_t Auswahl , uint8_t Index)
{
  char Befehl[] = {0};
  switch (Auswahl)
  {
    case 1: sprintf(Befehl, "u %u ", Index); break; // Zeige Uhrzeit an
    case 2: sprintf(Befehl, "l %u ", Index); break; // Zeige Runden an
    case 3: sprintf(Befehl, "r %u ", Index); break; // Zeige Rundenzeiten an
    case 4: sprintf(Befehl, "s %u ", Index); break; // Zeige Spannung an
    case 5: sprintf(Befehl, "g %u ", Index); break; // Zeige Tagesrunden an
    case 6: sprintf(Befehl, "f %u ", Index); break; // Zeige Fahrernamen an
    case 7: sprintf(Befehl, "t %u ", Index); break; // Zeige Temperatur an
    case 8: sprintf(Befehl, "h %u ", Index); break; // Zeige Luftfeuchtigkeit an
    case 9: sprintf(Befehl, "x %u ", Index); break; // Zeige Spur an
    case 12: sprintf(Befehl, "y %u ", Index); break; // Licht an
    case 13: sprintf(Befehl, "z %u ", Index); break; // Licht aus
  }
  sendData(Befehl);
}

void sendData(char *sendbuffer)                            // send data:  ID = 0x100, Standard CAN Frame, Data length = 8 bytes, 'data' = array of data bytes to send
{
  Serial.println(sendbuffer);
  const byte len = 8;
  byte data[len] = {0, 0, 0, 0, 0, 0, 0, 0};
  memcpy(data, sendbuffer, len);
  CAN0.sendMsgBuf(id, 1, len, data);                       // send data:  id, extended frame, data len = 8, data buf
  memcpy(data, sendbuffer + len, len);
  CAN0.sendMsgBuf(id + 1, 1, len, data);
  memcpy(data, sendbuffer + 2 * len, len);
  CAN0.sendMsgBuf(id + 2, 1, len, data);

}

// ********** ab hier Renndaten-Verarbeitung *********
void leseCanBus()
{
  unsigned long rxId = 0;
  byte len = 0;
  byte rxBuf[8];
  char text[30] = {0};
  if (CAN_MSGAVAIL == CAN0.checkReceive())           // check if data coming
  {
    char msg[2][30];
    CAN0.readMsgBuf(&rxId, &len, rxBuf);            // Read data: len = data length, buf = data byte(s)
    byte teil = rxId & 0xF;                         // Datensatz besteht aus 3 Teilen...0,1,2
    byte num = (rxId & 0xF0) / 16;                  //
    memcpy(msg[num] + teil * len, rxBuf, len);
    if (teil == 2) {
      snprintf(text, sizeof(text), msg[num]);
      //strcpy (text, msg[num]);      
//      Serial.print("Habe fogendes empfangen: ");
//      for(int i = 0; i < 30; i++) Serial.print(text[i]);
//      Serial.println(" ");
      AuswertungEmpfang(text); // Werte Datensatz aus
    }
  }
}

void AuswertungEmpfang(char* text)
{
  char *c;                                      // Teilstring
  c = strtok(text, " ");                        // Lese bis erstes Leerzeichen

  if (isDigit(c[0]))
  {
    uint8_t spur = (c[0] - '0');
    switch (c[1])
    {
      case 'R':                                 // Runde für die Spur
        AR[spur] = atoi(strtok(NULL, " "));
        break;
      case 'Z':                                 // Zeit für die Spur
        RZvk[spur] = atoi(strtok(NULL, " "));
        RZnk[spur] = atoi(strtok(NULL, " "));
        Time0 = RZvk[0] + (RZnk[0] / 1000.0);   // ...erstelle BESTZEIT Floatzahl für remoteXY
        Time1 = RZvk[1] + (RZnk[1] / 1000.0);   // ...erstelle FAHRER-1 Floatzahl für remoteXY
        Time2 = RZvk[2] + (RZnk[2] / 1000.0);   // ...erstelle FAHRER-2 Floatzahl für remoteXY
        Time3 = RZvk[3] + (RZnk[3] / 1000.0);   // ...erstelle FAHRER-3 Floatzahl für remoteXY
        Time4 = RZvk[4] + (RZnk[4] / 1000.0);   // ...erstelle FAHRER-4 Floatzahl für remoteXY
        
        if( Time0 != Time0_Old || Time1 != Time1_Old || Time2 != Time2_Old || Time3 != Time3_Old || Time4 != Time4_Old)
        {
          Time0_Old=Time0;Time1_Old=Time1;Time2_Old=Time2;Time3_Old=Time3;Time4_Old=Time4;
//          Serial.print("Neue Zeit auf Spur :");
//          Serial.println(spur);
          ZaehlerR ++;
          Serial.print("Zähler neue Rundenzeit= ");
          Serial.println(ZaehlerR);
          Send_Rundenzeit(spur);                    // ...sende Daten an RemoteXY
        }        
        break;
      case 'F':                                     // Fahrername für die Spur
        strcpy(Fahrer[spur], strtok(NULL, " "));
        strcat(Fahrer[spur], " ");
        strcat(Fahrer[spur], strtok(NULL, " "));
        if (memcmp(Fahrer_Aktuell[spur], Fahrer[spur], sizeof(Fahrer_Aktuell[spur])) != 0) // vergleiche ob gelesener Wert sich zu vorher geändert hat
        {
          for (int i = 0; i < 30; i++) Fahrer_Aktuell[spur][i] = Fahrer[spur][i];          // ...wenn verändert, dann aufnehmen
//          Serial.print("Neuer Fahrer auf Spur : ");
//          Serial.println(spur);
          ZaehlerF ++;
          Serial.print("Zähler neuer Fahrer= ");
          Serial.println(ZaehlerF);
          Send_Fahrer_Namen(spur);                                                         // ...sende Daten an RemoteXY                                                                 
        }
        break;
    }
  }

  else                                        // Ab hier nur zeigen Fernkonfiguration
  {
    switch (c[0])
    {
       case 'C':                                // C übernimmt die Temperatur 
        TempVK = atol(strtok(NULL, " "));       // übernimmt die Temperatur Vorkomma
        TempNK = atol(strtok(NULL, " "));       // übernimmt die Temperatur Nachkomma
        TempFloat = TempVK + (TempNK / 10.00);  // Erstelle eine Floatzahl für remoteXY
        break;

      case 'H':                                 // H  übernimmt die Luftfeuchtigkeit in %
        LuftVK = atoi(strtok(NULL, " "));       // übernimmt die Luftfeuchtigkeit Vorkomma
        LuftNK = atoi(strtok(NULL, " "));       // übernimmt die Luftfeuchtigkeit Nachkomma
        LuftFloat = LuftVK + (LuftNK / 10.00);  // Erstelle eine Floatzahl für remoteXY
        break;
    }
  }
}

void Send_Fahrer_Namen(uint8_t Spur)
{
  switch (Spur)
  {
    case 0: strcpy  (RemoteXY.Fahrer_0, Fahrer_Aktuell[Spur]);break;// Serial.print("Bester Fahrer Spur "); Serial.print(Spur); Serial.println(Fahrer_Aktuell[Spur]); break;
    case 1: strcpy  (RemoteXY.Fahrer_1, Fahrer_Aktuell[Spur]);break; //Serial.print("Neuster Fahrer Spur "); Serial.print(Spur); Serial.println(Fahrer_Aktuell[Spur]); break;
    case 2: strcpy  (RemoteXY.Fahrer_2, Fahrer_Aktuell[Spur]);break; //Serial.print("Neuster Fahrer Spur "); Serial.print(Spur); Serial.println(Fahrer_Aktuell[Spur]); break;
    case 3: strcpy  (RemoteXY.Fahrer_3, Fahrer_Aktuell[Spur]);break; //Serial.print("Neuster Fahrer Spur "); Serial.print(Spur); Serial.println(Fahrer_Aktuell[Spur]); break;
    case 4: strcpy  (RemoteXY.Fahrer_4, Fahrer_Aktuell[Spur]);break; //Serial.print("Neuster Fahrer Spur "); Serial.print(Spur); Serial.println(Fahrer_Aktuell[Spur]); break;

  }
}
void Send_Rundenzeit(uint8_t Spur)
{
  switch (Spur)
  {
    case 0: dtostrf(Time0, 0, 3, RemoteXY.Time_0);break;// Serial.print("Beste Rundenzeit Spur: "); Serial.print(Spur);Serial.print("  ");Serial.println(Time0,3); break;
    case 1: dtostrf(Time1, 0, 3, RemoteXY.Time_1);break;// Serial.print("Beste Rundenzeit Spur: "); Serial.print(Spur);Serial.print("  ");Serial.println(Time1,3); break;
    case 2: dtostrf(Time2, 0, 3, RemoteXY.Time_2);break; //Serial.print("Beste Rundenzeit Spur: "); Serial.print(Spur);Serial.print("  ");Serial.println(Time2,3); break;
    case 3: dtostrf(Time3, 0, 3, RemoteXY.Time_3);break;// Serial.print("Beste Rundenzeit Spur: "); Serial.print(Spur);Serial.print("  ");Serial.println(Time3,3); break;
    case 4: dtostrf(Time4, 0, 3, RemoteXY.Time_4);break; //Serial.print("Beste Rundenzeit Spur: "); Serial.print(Spur);Serial.print("  ");Serial.println(Time4,3); break;
  }
}
[/code]

Moin,

herrlich welcome in the new future :slight_smile:

Mal kurz drüber geschaut.
Du hast vermutlich ein Timingproblem.

Erinnerst Dich noch an die Aufteilerei und das senden nur bei Änderung?
Das sollte hier auch passieren.

Hast mal nen Bild vom aktuellen Türmchen? Ich will das ZDF-Logo sehen :grin: :grin: :grin:

Hallo my_xy_projekt,
...aber ja ich erinnere mich und habe es auch so umgesetzt, sende nur ans Handy wenn ich einen neuen Fahrernamen oder eine neue Rundenzeit erhalten habe. Ich vermute eben memcpy oder die lib von remotexy....? Aber für so ein tiefen einblick fehlt mir leider das Verständnis und auch leider die Zeit. Passiert immer zuviel drum rum, Schimmel im Schlafzimmer z.B.

Leben ist das was passiert, während man etwas anderes plant.....

Aber allein eine Bluetooth-Verbindung zum Handy reicht um die Daten abschneiden zu lassen.
Bildchen muss ich nachreichen.....steht schon auf der Bahn. Aber wird gemacht.

Die Verbindung oder eine Übertragung?

Wieviel Nutzbytes kannst Du mit einer Übertragung via BT wegbringen?
Wenn Du dafür zwei Übertragungen brauchst, stockt evtl. zwischendurch der Rest.

Und ich muss mir das mal genauer ansehen - normalerweise müsste sich das doch wieder syncen, wenn Du passend parst...
Na mal sehen.

Hallo my_xy_projekt,
ich glaube die lib von remoteXY beginnt mit der Übertragung solbald eine Verbindung über Bluetoth aufgebaut ist.

Zu via BT wegbringen habe ich im Datenblatt folgendes gefunden
Speed: Asynchronous: 2-6K Bytes, Synchronous: 2-6K Bytes

Ich werde mal versuchen das ganze auf ein Fahrer zubegrenzen mal schaun was dabei rumkommt.

ich hab auch grad angefangen :slight_smile:
Erstmal mit dem Download der lib...

Dann hab ich Deinen Code mal länger angeschaut :eyes: Da ist aber viel zu überarbeiten...

Hast Du die app als pro-version?

3 Motnats Abo für den angebissenen Apfel..... geht aber für 60sec. auch ohne.

1 Like

Kannst Du mal drei neue Variablen und den loop einbauen?
Ich will mal die Timings sehen.

const byte maxMemory = 20;
uint32_t memory[maxMemory] = {0};
byte idxMemory;


void loop()
{
  memory[idxMemory] = millis();
  idxMemory++;
  RemoteXY_Handler ();
  memory[idxMemory] = millis();
  idxMemory++;
  leseCanBus();
  if (idxMemory > maxMemory)
  {
    idxMemory = 0;
    Serial.println();
    for (byte b = 1; b < maxMemory; b++)
    {
      Serial.print(memory[b] - memory[b - 1]);
      Serial.print(", ");
    }
    Serial.println();
  }
}

Der wird recht schnell durchlaufen.
irgendwann einfach das Autoscroll anhalten und mir mal einen Block rauskopieren, damit ich mal ne Vorstellung bekomme....

mhmm...sieht ja wild aus :smile:
Hier das Ergebnis:

Setting BaudratEntering Configuration Mode Successful!
Setting BaudratEntering Configuration Mode Successful!
Returning to Previous Mode Failure...
CAN BUS Shield init fail
Entering Configuration Mode Successful!
Setting BaudratEntering Configuration Mode Successful!
Setting BaudratEntering Configuration Mode Successful!

Und das wiederholt sich....

Ups. Das gehört mir nicht..
Der macht irgendwas, was ich nicht erklären kann.
Speicher geht ihm nicht aus - ich hab das extra kompiliert, mit seinen 6 & 19% ist das was ganz kleines.

Bau mal ins setup nach dem Serial.begin() ein delay(500) ein.

Der Fehler versteckt sich da, wo man ihn nicht sucht :wink:

Wollte nur einen Gruß senden!

Starte....
Entering Configuration Mode Successful!
Setting Baudrate Successful!
CAN BUS Shield init ok!

in Dauerschleife....

@agmue war schneller.
Du hast irgendwo einen MemoryLeak
Und ich hab schon einen:

das +1 ist ganz bestimmt an der falschen Stelle :wink:

Ändere mal meine Zeile in:

if (idxMemory >= maxMemory) // Neu: =

Ich schreib auch drüber weg :wink:

Hallo agmue,
..... Begehe Fehler nur einmal :wink:
Gruß zurück

das +1 ist ganz bestimmt an der falschen Stelle....aber mhmm.

Nach meiner Meinung müsste es doch richtig sein den:
Max 8 Fahrspuren aber da kommt der Beste Fahrer mit Bestzeit und auch auf welcher die Bestzeit gefahren wurde.

Sind sozusagen 8 Fahrer mit einem Fahrer[0] für Rekorddaten.

Ergebnis.txt (4.0 KB)
Hab da mal ein größeren Ausschnitt gemacht.

Bin mal kurz was essen....gleich wieder da :smiley:

Ok, wenn Du 9 Werte hast, dann schreib nicht +1 sondern leg eine zusätzliche Konstante an, damit man sieht, warum das so ist :slight_smile: Aber das char-Array ist auf 30 gesetzt. Du brauchst aber 31 um 30 abzubilden. Das letzte char ist \0 oder Du musst überall die Länge mitgeben.
Spätestens beim strcpy fällt Dir das auf die Füsse.

:slight_smile:

Na nicht schlecht.
Also bleibt er zumindest nicht hängen.

ich überleg mal...

um dich auf Abwege zu führen:
CANBUS, Bluetooth, Handy ...
also das schreit bei mir nach einen ESP32.
Der kann CANBUS (brauchst nur einen Pegelwandler)
der kann Bluetooth
der könnte auch WiFi

also bevor ich da an einen 8-bit Arduino 2 Module ranhänge - ich würde da ein ESP32 Board nehmen.

ganz dünnes Eis.... :sweat_smile:

....das stammt von Dir aus 2020, hab's bis heute so übernommen.
Für mich war "char Fahrer[maxSpuren + 1][charNum] = {0};"
Fahrer[0][30] ist der Highscore
Fahrer[X][30] ist der X =Spur 1 bis 8

Es wurde ja nur so gemacht damit man die Spuren einstellen kann 2,4,6 oder 8 und dann +1 um immer einen Wert mehr für den Highscore zu haben.

Und die Fahrernamen dürfen 29 Zeichen nicht überschreiten.....