INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Problem mit #define
23.09.2019, 18:02
Beitrag #1
Problem mit #define
Hallo,
ich habe einen DUE, der hat mehrere serielle Schnittstellen. Ich möchte auf Serial nur beim Start eine Meldung ausgeben, der Rest soll dann auf Serial1 gehen. Für Tests am PC ist es aber praktischer, alles auf Serial zu haben. Ich habe das per #define umschaltbar gemacht:
Code:
// Serial oder Serial1 setzen
#define Serialx Serial1

void setup()
{
  Serialx.begin(115200);
  Serialx.println("Version 1.0");
  if (Serialx != Serial) {
    Serial.begin(115200);
    Serial.println("Alle Ausgaben und Menues auf Serialx");
  }
// .... weiteres
}
Das funktioniert bis auf einen Punkt: Der Vergleich "Serialx != Serial" geht nicht, das verstehe ich ansatzweise. Aber wie kann man das machen? Eigentlich müsste es doch eine #if-Anweisung für den Vergleich geben, aber da habe ich nichts gefunden.

Viele Grüße
GuaAck
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.09.2019, 20:52
Beitrag #2
RE: Problem mit #define
Alle
#if
#define
#...
Anweisungen werden durch den Präprozessor vor der Compilierung einmalig als reine Textersetzung durchgeführt. Danach sind sie nicht mehr verfügbar.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.09.2019, 22:31
Beitrag #3
RE: Problem mit #define
Tommy,
Danke, das war mein Plan, ich war aber nicht sicher, dass es wirklich so ist.

Mit
Code:
word s = Serial;
word s1 = Seria1l;
haben s und s1 den Wert 1, unabhängig davon, ob ein ...begin() gelaufen ist. Logisch, dass meine Abfrage nichts bringt.

Es ist also keine Frage des Preprozessors. Meine Frage hat sich damit erledigt, dennoch, vielleicht findet ja wer, der eine Lösung hat.

Gruß
GuaAck


(23.09.2019 20:52)Tommy56 schrieb:  Alle
#if
#define
#...
Anweisungen werden durch den Präprozessor vor der Compilierung einmalig als reine Textersetzung durchgeführt. Danach sind sie nicht mehr verfügbar.

Gruß Tommy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.09.2019, 08:24 (Dieser Beitrag wurde zuletzt bearbeitet: 24.09.2019 08:28 von MicroBahner.)
Beitrag #4
RE: Problem mit #define
Du könntest das so realisieren:

Code:
#define TESTMODE

#ifdef TESTMODE
    #define Serialx Serial
#else
    #define Serialx Serial1
#endif

void setup()
{
  Serialx.begin(115200);
  Serialx.println("Version 1.0");
  #ifndef TESTMODE
    Serial.begin(115200);
    Serial.println("Alle Ausgaben und Menues auf Serial1");
  #else
    #warning "Testmode aktiv"
  #endif
// .... weiteres
}
Für den Normalbetrieb die Zeile mit TESTMODE auskommentieren:
Code:
//#define TESTMODE

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.09.2019, 09:19
Beitrag #5
RE: Problem mit #define
Der Vergleich geht auch (MEGA)
Code:
HardwareSerial s1 = Serial;
HardwareSerial s2 = Serial1;

void setup() {
  HardwareSerial s = s1;
  if (s == Serial) {
    s.begin(115200);
    s.println("Serial");
  }
}

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.09.2019, 21:22
Beitrag #6
RE: Problem mit #define
Hallo Microbahner und Tommy,

vielen Dank zunächst. Mir gefällt die Lösung mit der bedingten Compilierung gut.

Tommys Code habe ich nicht compilert bekommen, vermutlich fehlt mir eine Lib, in der der Code zu dem abstrakten Typ implementiert ist. (cannot declare variable 'Serialx' to be of abstract type 'HardwareSerial').

Aber mein Problemchen ist gelöst, vielen Dank nochmals.

Gruß
GuaAck
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.09.2019, 21:30 (Dieser Beitrag wurde zuletzt bearbeitet: 24.09.2019 21:42 von Tommy56.)
Beitrag #7
RE: Problem mit #define
(24.09.2019 21:22)GuaAck schrieb:  (cannot declare variable 'Serialx' to be of abstract type 'HardwareSerial').
In meinem Code ist aber überhaupt kein Serialx und der compiliert nur für den MEGA.

Die #define-Variantze würde ich dann aber weiter ausbauen, um nicht immer die #ifdef/#endif-Orgie zu schreiben:

Code:
#define DEBUG 1
// Grundlegende DEBUG-Defines
// Bei DEBUG 0 werden die Ausgaben nicht einkompiliert
#if (DEBUG == 0)
  #define dbgp(...)     // Serial.print
  #define dbgpn(...)    // Serial.println
#if defined ESP8266    || defined ESP32
    #define dbgpf(...)    // Serial.printf nur auf ESP definiert
#endif    
  #define dbgbeg...)    // Serial.begin
#else
  #define dbgp(...) Serial.print(__VA_ARGS__)
  #define dbgpn(...) Serial.println(__VA_ARGS__)
#if defined ESP8266    
    #define dbgpf(...) Serial.printf(__VA_ARGS__)
#endif
  #define dbgbeg(...) Serial.begin(__VA_ARGS__)
#endif


// Testmode-Variante
#define TESTMODE = 1;
#if (TESTMODE == 1)
#define dbgp(...) Serial.print(__VA_ARGS__)
  #define dbgpn(...) Serial.println(__VA_ARGS__)
  #define MODUS TEST
#if defined ESP8266    
    #define dbgpf(...) Serial.printf(__VA_ARGS__)
#endif
  #define dbgbeg(...) Serial1.begin(__VA_ARGS__)#else
  #define dbgp(...) Serial1.print(__VA_ARGS__)
  #define dbgpn(...) Serial1.println(__VA_ARGS__)
  #define MODUS PROD
#if defined ESP8266    
    #define dbgpf(...) Serial1.printf(__VA_ARGS__)
#endif
  #define dbgbeg(...) Serial1.begin(__VA_ARGS__)
#endif

void setup() {
  dbgbeg(115200);
  dbgp("Start"); dbgpn(MODUS);
}

Den MODUS habe ich jetzt nicht getestet.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  I2C: Arduino DUE -- DS3231: Merkwürdiges Problem GuaAck 8 188 Heute 19:57
Letzter Beitrag: GuaAck
  Problem mit Fingerprintlib nanofanman 10 207 Heute 11:54
Letzter Beitrag: nanofanman
  Problem mit den Daten aus dem CAN BUS Gary 10 429 19.10.2019 10:21
Letzter Beitrag: Gary
  Mp3-Modul library Problem Prospekteur 1 364 28.09.2019 20:30
Letzter Beitrag: hotsystems
  PZS Problem mit Ausgang schalten Flötzinger 0 572 28.06.2019 15:53
Letzter Beitrag: Flötzinger
  Problem mit UniversalTelegramBot edi_ying 8 947 09.02.2019 15:11
Letzter Beitrag: Tommy56
Question (Denk)Problem mit char array[] ? ManfredH 3 678 05.02.2019 12:01
Letzter Beitrag: ManfredH
  USB Problem mit Linux HeikeF 5 933 03.02.2019 17:04
Letzter Beitrag: Tommy56
  Drehgeber wie Iduino SE055 - Software- oder Hardware-Problem? Arduinero 12 1.143 24.01.2019 13:55
Letzter Beitrag: Bitklopfer
  [Anfänger] Char Array Problem fp.blues2013 1 576 07.01.2019 13:06
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste