Go Down

Topic: Serial ersetzen (Read 623 times) previous topic - next topic

hole

Ich will ein kleines Display mit ST7735-Controller als Debug-Ausgabe nutzen. Dazu dachte ich mir: einfach in die vorhandene Serial-Variable ein neues Objekt zu hängen. Hier der anskizziert Prototyp.

Leider gibt es bereits beim Übersetzen einen Fehler, "error: expected type-specifier before " und ich scheitere furios an meinen rostigen C++-Kenntnissen.

Code: [Select]
#include <SoftwareSerial.h>

class ST7735Serial : public SoftwareSerial // oder Stream?
{
private:
public:
        ST7735Serial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic = false);

void begin(uint16_t baud_count);
void end(void);

virtual int available(void);
virtual void accept(void);
virtual int peek(void);
virtual int read(void);
virtual void flush(void);
virtual size_t write(uint8_t);
using Print::write;
operator bool();
};

void ST7735Serial::flush()
{
}

int ST7735Serial::available()
{
  return 0;
}

int ST7735Serial::peek()
{
  return -1;
}

int ST7735Serial::read()
{
  return -1;
}

// ?? virtual void accept(void);
size_t ST7735Serial::write(uint8_t) {
}

void ST7735Serial() {
}


void setup()
{
  Serial = new ST7735Serial();   //<--- "error: expected type-specifier before "
 
 
}

void loop()
{
}



michael_x

Tja, da muss ich dem Compiler leider recht geben

Code: [Select]
  Serial = new ST7735Serial();   //<--- "error: expected type-specifier before "

verstehe ich auch nicht. Meinst du etwa

Code: [Select]
ST7735Serial mySerial(3,4);  // Eine Instanz der Klasse ST7735Serial  mit ReceivePin = 3, TransmitPin =4

Serenifly

Ich glaube er wollte die bestehende Serial Variable irgendwie überschreiben

hole

Quote
Ich glaube er wollte die bestehende Serial Variable irgendwie überschreiben
Das glaube ich auch!

michael_x


Ich glaube er wollte die bestehende Serial Variable irgendwie überschreiben

Das geht für lokale Variable oder in einem anderen namespace, aber das willst du nicht wirklich, hole, denke ich ;)

Bei der Gelegenheit könnte man nochmal fragen, was der Unterschied zur Basisklasse SoftwareSerial sein soll.
So wie es jetzt aussieht ist der Unterschied, dass ST7735Serial gar nichts macht.

Die Funktionen, die aus der Basisklasse unverändert übernommen werden ohne eigene Implementation, wie z.B. operator bool(),
sollten in der Klassendefinition gar nicht separat auftauchen, denke ich.

hole

Doch, genau das will ich.

Ziel ist es, alle Serial.print() im Code lassen zu können und die Ausgaben auf das Display umzulenken.

Dass das ST7735Serial  noch nichts macht liegt im Kern daran, dass ich top-down programmiere.

michael_x

Hab mir mal
  hardware\arduino\cores\arduino\HardwareSerial.h
angesehen. Wenn du in deiner .ino gleich am Anfang
#define HardwareSerial_h
schreibst, wird die Original HardwareSerial.h nicht verwendet, und damit ist dann auch
   extern HardwareSerial Serial;
weg

Code: [Select]
#define HardwareSerial_h
#include <SoftwareSerial.h>

class Test : public SoftwareSerial{
public:
Test(byte rx, byte tx): SoftwareSerial(rx, tx) {}
};

Test Serial(3,4);
void setup() {
  Serial.begin(9600);
}

void loop() {}

Das compiliert zumindest.

hole

Ja, das klappt,  danke!

Mir wäre es lieber, zu verstehen, warum ich der Variable Serial nicht ein anderes Objekt zuweisen kann. Das ist m. E. viel schöner und entspräche dem Gedanken von Objekten.

michael_x

Quote
Mir wäre es lieber, zu verstehen, warum ich der Variable Serial nicht ein anderes Objekt zuweisen kann.


Kannst du so doch, oder ?

Im Beispiel ist Serial eine Instanz der Klasse Test, die wiederum von SoftwareSerial abgeleitet ist..

Wenn (wie bei Standard-Arduino) HardwareSerial.h aktiv ist , ist Serial eben als ein Objekt der Klasse HardwareSerial deklariert. ( Und wird wohl von HardwareSerial.cpp global zur Verfügung gestellt, damit Arduino - Programmieren schön einfach ist. )

Entweder ich verstehe dein Problem nicht, oder da ist noch ein Haken, den ich gar nicht sehe.

Go Up