OLED Displays wiederholen sich unendlich

Moin,

ich bin noch recht neu im Arduino basteln und ich bin auf ein Problem gestoßen, womit ich nicht weiter komme und ich hoffe hier kann mir jemand helfen. Ich möchte das mal kurz beschreiben.

Ich möchte in einem OLED Displays 3 Variablen anzeigen. Die Daten kommen aus einer Schnittstelle von DCS World Namens DCS Bios.
Die Variablen werden schon richtig angezeigt, nur aus einem mir unergründlichen Problem wiederholen die sich immer.
Variable 1 = Scr1
Variable 2 = Scr2
Variable 3 = ScrNumber

Im Display wird erst Scr1 dann Scr2 und dann ScrNumber angezeigt. Das geht auch soweit.

Aktuell wird aber Scr1 dann Scr2 dann ScrNumber angezeigt und nach Scr2 wird zusätzlich noch Scr1 wiederholt. Scr1 Wiederholung und ScrNumber überlagern sich aber dadurch und das Display ist kaum noch zu entziffern.

Kommentiere ich Scr1 aus und lasse Scr2 und ScrNumber allein einblenden, und beide ganz links im Display, dann wird Scr2 dann ScrNumber und dann Scr 2 angezeigt. Also gleiches Problem.

Ist eine Anzeige "fertig" dann wiederholt sich die davor. Kann man das mit einem Befehl den ich leider nicht kenne verhindern?

Vielen Dank schon mal.
Gruß Sky

Sketch füge ich mal mit an. Ich hoffe das geht so.

#define DCSBIOS_RS485_SLAVE 1
#define TXENABLE_PIN 2


#include <Arduino.h>
#include <U8g2lib.h>
#include "DcsBios.h"


#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif


U8G2_SSD1305_128X32_NONAME_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* dc=*/ 9, /* reset=*/ 8);


int i;
//char op1[12] = "";
char scr1[2] = "";
char scr2[2] = "";
char scrL[8] = "";
 
void setup(void) {
  u8g2.begin();
  DcsBios::setup();
  for(int i = 0; i < 2; i++){
    scr1[i] = ' ';
  }
  for(int i = 0; i < 2; i++){
    scr2[i] = ' ';
  }
  for(int i = 0; i < 8; i++){
    scrL[i] = ' ';
  }
}


void loop(void) {  
  DcsBios::loop();  
}


void onUfcScratchpadNumberDisplayChange(char* newValue) {   


  for(i = 0; i < 8; i++) {
    scrL[i] = newValue[i];
}
 displayPrintScr(); 
}
DcsBios::StringBuffer<8> ufcScratchpadNumberDisplayBuffer(0x543e, onUfcScratchpadNumberDisplayChange);
 
void onUfcScratchpadString1DisplayChange(char* newValue) { 
 
  for(i = 0; i < 2; i++) {
    scr1[i] = newValue[i];
}
 displayPrintScr();
}
DcsBios::StringBuffer<2> ufcScratchpadString1DisplayBuffer(0x5446, onUfcScratchpadString1DisplayChange);


void onUfcScratchpadString2DisplayChange(char* newValue) {
    for(i = 0; i < 2; i++) {
      scr2[i] = newValue[i];
    }
    displayPrintScr();
}
DcsBios::StringBuffer<2> ufcScratchpadString2DisplayBuffer(0x5448, onUfcScratchpadString2DisplayChange);
 
void displayPrintScr() {
  u8g2.clearBuffer();         // clear the internal memory 
  u8g2.setFont(u8g2_DcsFontScratch1_3_tf); // choose a suitable font
       //u8g2.setCursor(-25,25);
  u8g2.drawUTF8(5,25,scr1);  // write something to the internal memory      
  //u8g2.setFont(u8g2_DcsFontScratch1_1_tf); // choose a suitable font
       // u8g2.setCursor(25,25);
  u8g2.drawUTF8(37,25,scr2);  // write something to the internal memory      
  //u8g2.setFont(u8g2_DcsFontScratch1_3_tf); // choose a suitable font
       //u8g2.setCursor(42,25);
  u8g2.drawUTF8(58,25,scrL);  // write something to the internal memory
  u8g2.sendBuffer();          // transfer internal memory to the display     
}

Hi

Ich werde aus Deiner Problembeschreibung nicht richtig schlau.
Weiter setze bitte Deinen Sketch in Code-Tags - Das geht auch nachträglich (Post Editieren).
STRG-T in der IDE erhöht die Lesbarkeit, solltest Du vermehrt Leerzeilen im Sketch haben, schadet Es auch nicht, Diese auf ein Minimum zu reduzieren.

MfG

Ich hoffe das geht so

Leider geht es so nicht.

Benutze das </> Symbol, um Code zu posten. Dann erzeugt auch [i``] nicht kursiven Text.

Kannst du auch nachträglich machen ( more -- modify )

Ich habe das mal in Code Tags gesetzt. Sorry dafür.
Ich kann das kaum besser beschreiben und poste mal 2 Bilder.

Das eine ist was angezeigt werden soll. Das Zweite ist was angezeigt wird im OLED.

Könnte es sein, dass dir bei den Texten die Endekennung fehlt?

Wenn du char scrL[8] = "";
definiert hast, solltest du nur 0..6 überschreiben, und scrL[7] immer so lassen, wie es ist.

Ich bin nicht sicher was du meinst.

Char scr1[2] = ""; Scr1 hat in der Schnittstelle 2 Stellen in der Ausgabe.
Char scr2[2] = ""; Scr2 das Gleiche.
Char scrL[8] = ""; ScrL hat in der Schnittstelle halt 8 Stellen.

Ich weiß nicht wie man ein Ende definieren kann. Ich habe gedacht wenn ich 8 Stellen angebe, ist automatisch Schluss.

Hi

Ein Char-Array (C-String) wird mit /0 abgeschlossen - damit 'weiß' der µC, daß der Text Da zuende ist.
Wenn Du aber 8 Nutz-Zeichen hast, fehlt die abschließende /0 und der auszugebende Char-String ist eben NICHT mach 8 Zeichen zuende, dahinter stehen auch noch Zeichen, Die Alle kein /0 sind und werden somit ebenfalls ausgegeben.

MfG

Möglicherweise genügt es, die Felder im ein Zeichen zu vergrößern:

char scr1[3] = "";
char scr2[3] = "";
char scrL[9] = "";

agmue:
Möglicherweise genügt es, die Felder im ein Zeichen zu vergrößern:

char scr1[3] = "";

char scr2[3] = "";
char scrL[9] = "";

Vielen vielen Dank!!! Das hat es gebracht. Problem gelöst.
Wie einfach es doch sein kann.
Mich würde aber trotzdem noch interessieren warum ich eine Stelle mehr angeben muß.

Danke für eure Bemühungen!!!

Das wurde Dir in #6 doch erklärt. Weitere Infos gibt es hier.

Gruß, Tommy

char scr1[2] = "";  // 0x000000
...
  for(int i = 0; i < 2; i++){
    scr1[i] = ' ';
  }  // 0x202000
...
  for(i = 0; i < 8; i++) {
    scrL[i] = newValue[i];
  }  // 0x414200  wenn 'A' in newValue[0] und 'B' in newValue[1] enthalten ist