Auslagern von Programmcode für Anfänger

Hallo,
vorweg: Meine C-Kenntnisse sind etwas rudimentär. Deshalb verwende ich beim Arduino meistens die Beispiele und ändere sie nach meinen Bedürfnissen ab.
Aber man lernt ja mit jeder Zeile Code dazu :slight_smile:

Nun sitz ich allerdings schon einige Stunden an einem Problem und komme nicht weiter. Vllt. kann mir ja jemand helfen.
Ich möchte über die serielle eine Bytesequenz senden. Ich habe die Daten als bytearray deklariert:

#define myserial Serial1 // Ausgabe über "Serial-1"
#include <request.h>

/*
byte sendcode[]={
0x2B,0x2B,0x2B,0x2B,0x0F,0x0F,0x0F,0x0F,0x26,0x02,0x0F,0x62,0x0F,0x62,0xFF,0x22,
0x63,0x0F,0x00,0x22,0x0F,0x09,0x3F,0x32,0x33,0x34,0x35,0x36,0x32,0x38,0x02,0x4E,
0x4B,0x9B,0x42,0x53,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x0F,0x09,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x62,0x0F,
0x63,0xF0,0xB3,0x00,0x26,0x02,0x0F,0x80,0x96,0xB4,0x0F,0x00,0x62,0x0F,0x62,0xFF,
0x22,0x63,0x02,0x00,0x25,0x02,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x09,0x3F,0x3F,0x3F,
0x3F,0x3F,0x3F,0x3F,0x3F,0x02,0x0F,0x80,0x96,0xB4,0x0F,0x00,0x63,0x40,0x4A,0x00,
0x26,0x02,0x0F,0x80,0x96,0xB4,0x02,0x00,0x62,0x0F,0x62,0xFF,0x22,0x63,0x02,0x00,
0x25,0x02,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x09,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,
0x3F,0x02,0x0F,0x80,0x96,0xB4,0x02,0x00,0x63,0xDE,0xCC,0x00,0x26,0x02,0xFF,0x62,
0x0F,0x62,0xFF,0x22,0x63,0x02,0x00,0x2F,0x0F,0x63,0x82,0x2F,0x00,0x00,0x00,0x00,
0xFB,0xFB,0xFB,0xFB,0xFA,0x03,0xFD,0x2D
};
*/

Alles klappt, wenn ich das bytearray im "Hauptprogramm" deklariere. Also im *.INO-Sketch.
Jetzt wollte ich aber, um etwas strukturierter zu arbeiten diese Deklaration in eine extra Datei auslagern.
Also hab ich das, was man im Beispiel zwischen den Kommentarmerkern sieht, in eine Datei "request.h" reinkopiert.
Die Datei dann mit #include <request.h> eingebunden.
Aber so läufts nicht.
Bekomm dann beim Kompilieren ein: 'sendcode' was not declared in this scope.

Hat da jemand eine Idee

gruß/hk007

Schritt 1: packe Deine Dateien in ein Zip File und hänge das an den Post. Was Du geschrieben hast reicht nicht für eine Fehleranalyse. Im Zweifelsfall sollte es ausreichen den Code einfach so wie er vorher war in eine extra Datei zu stellen. Wenn das nicht klappt Google mal nach "Arduino library tutorial".

Du kannst einen Teil des Sketches als 2. .ino Datei in dem gleichen Ordner wie den Hauptsketch speichern. Beim kompilieren faßt der IDE beide Files zusammen. Da Dein Programmteil keine Funkton ist, sondern eine Variablendeklaration weiß ich nicht, ob das so funktioniert.

Was sich sehe ist aß die Variablendeklaration auskomentiert ist. Ist das in Deinem request.h auch so?

Die Orginalfiles helfen sicher Dir besser helfen zu können.

Grüße Uwe

Hi,
ok dachte die Infos reichen. Um das Lesen einfacher zu machen, und auch Fehlerquellen auszuschliessen, hab ich die Software mal nur auf das "Problem" reduziert:
Hier meine "Serial_Test.ino"

#define myserial Serial1 // Ausgabe über "Serial-1"
#include <sendreq.h>

void setup() {
  // initialize serial:
    myserial.begin(9600);
    myserial.println("---Programmstart---");  
    }

void loop() {
  request();
  delay(1000);
  }

void request() {
    for(int x=0; x <= 214; x++) {
    myserial.print (char(sendcode[x]));
    } 
}

und hier die "sendreq.h"

//Sendetelegramm

byte sendcode[]={
0x1B,0x1B,0x1B,0x1B,0x01,0x01,0x01,0x01,0x76,0x02,0x01,0x62,0x01,0x62,0xFF,0x72,
0x63,0x01,0x00,0x77,0x01,0x09,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x07,0x4E,
0x4B,0x9B,0x42,0x53,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x01,0x09,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x62,0x01,
0x63,0x10,0xB3,0x00,0x76,0x07,0x01,0x80,0x96,0xB4,0x01,0x00,0x62,0x01,0x62,0xFF,
0x72,0x63,0x07,0x00,0x75,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x09,0x31,0x31,0x31,
0x31,0x31,0x31,0x31,0x31,0x07,0x01,0x80,0x96,0xB4,0x01,0x00,0x63,0x40,0x4A,0x00,
0x76,0x07,0x01,0x80,0x96,0xB4,0x02,0x00,0x62,0x01,0x62,0xFF,0x72,0x63,0x07,0x00,
0x75,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x09,0x31,0x31,0x31,0x31,0x31,0x31,0x31,
0x31,0x07,0x01,0x80,0x96,0xB4,0x02,0x00,0x63,0xDE,0xCC,0x00,0x76,0x02,0xFF,0x62,
0x01,0x62,0xFF,0x72,0x63,0x02,0x00,0x71,0x01,0x63,0x82,0x7F,0x00,0x00,0x00,0x00,
0x1B,0x1B,0x1B,0x1B,0x1A,0x03,0xFD,0x7D
};

Im Anhang hab ich es auch noch mal gepackt.

gruß/hk007

Serial_Test.zip (970 Bytes)

Wenn Du die Funktion void request() und die Daten in das File sendreq.ino schreibst dann müßte es funktionieren. Einfach Serial_Test.ino im IDE öffnen, ein 2. Tab öffnen, den Code hineinschreiben und mit dem Namen sendreq.ino abspeichern.

//Sendetelegramm

byte sendcode[]={
0x1B,0x1B,0x1B,0x1B,0x01,0x01,0x01,0x01,0x76,0x02,0x01,0x62,0x01,0x62,0xFF,0x72,
0x63,0x01,0x00,0x77,0x01,0x09,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x07,0x4E,
0x4B,0x9B,0x42,0x53,0x00,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0x01,0x09,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x62,0x01,
0x63,0x10,0xB3,0x00,0x76,0x07,0x01,0x80,0x96,0xB4,0x01,0x00,0x62,0x01,0x62,0xFF,
0x72,0x63,0x07,0x00,0x75,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x09,0x31,0x31,0x31,
0x31,0x31,0x31,0x31,0x31,0x07,0x01,0x80,0x96,0xB4,0x01,0x00,0x63,0x40,0x4A,0x00,
0x76,0x07,0x01,0x80,0x96,0xB4,0x02,0x00,0x62,0x01,0x62,0xFF,0x72,0x63,0x07,0x00,
0x75,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x01,0x09,0x31,0x31,0x31,0x31,0x31,0x31,0x31,
0x31,0x07,0x01,0x80,0x96,0xB4,0x02,0x00,0x63,0xDE,0xCC,0x00,0x76,0x02,0xFF,0x62,
0x01,0x62,0xFF,0x72,0x63,0x02,0x00,0x71,0x01,0x63,0x82,0x7F,0x00,0x00,0x00,0x00,
0x1B,0x1B,0x1B,0x1B,0x1A,0x03,0xFD,0x7D
};

void request() {
    for(int x=0; x <= 214; x++) {
    myserial.print (char(sendcode[x]));
    } 
}

Habs aber nicht ausgetestet darum Vorsicht.
Grüße Uwe

Irgendwie scheint aber auch der Name meiner zweiten Datei eine Rolle zu spielen.
Ich hab die jetz mal sendreq.ccp genannt. natürlich auch den include Aufruf in meinem Hauptsketch entsprechend abgeändert.
Dann kommt beim Compilieren eine andere Fehlermeldung:

sendreq.cpp:2: error: 'byte' does not name a type

@uwefed:
Zwei *.inos in einem Verzeichnis mag er gar nicht :frowning:
Da kommt dann eine Fehlermeldung, daß sich die *,ino in einem Verzeichnis mit selben Namen befinden muss.
Edit: Passiert nur, wenn ich auf das andere *.ino doppelklicke.

Eine zweite .ino in einem Verzeichnis wird über das Erzeugen eines neuen Tabs in der IDE (kleines nach unten zeigendes Dreieck rechts auf Höhe des Dateinamens) erzeugt. Hier wird dann der entsprechende Code eingefügt.

.ccp gibt es nicht und wenn, dann .cpp als library-Datei, dazu benötigt man aber dann auch eine header (.h)-Datei die entsprechenden Prototypen und in der cpp die entsprechenden Konstruktoren.

@uwefed.

Deine Idee war ein Volltreffer. Die Funktion in das Unterprogramm mit zu übernehme ist sowieso der nächste logische Schritt
Hab das allerdings noch nirgendwo gesehen/gelesen, daß man Code in einer zweiten *.INO auslagern kann.
Es klappt sogar die "Variablen-Übergabe" in beide Richtungen. Also das Unterprogramm erkennt 'myserial' und das Hauptprogramm erkennt die void 'request'.

Gruß/hk007

Eine zweite .ino in einem Verzeichnis wird über das Erzeugen eines neuen Tabs in der IDE (kleines nach unten zeigendes Dreieck rechts auf Höhe des Dateinamens) erzeugt. Hier wird dann der entsprechende Code eingefügt.

Ja, wie sagt der Lodda: again what learned.

Ich hab halt auf Dateiebene rumgespielt. Angeregt von einem Beispiel aus der LCD4884, wo eine Grafik als Hex-Datei (DFrobot_bmp.h) eingebunden wurde. Dachte das wäre der richtige Weg.

Danke @all /hk007

Das mit dem include ist auch ein gangbarer Weg aber ich kann Dir nicht sagen wo im IDE der Compiler das File sucht.
Ein Ort ist arduinoxx/libraries/name_library/name_library.h
grüße Uwe

Ach so.
Nach dem letzten Post hab ich jetzt auch bemerkt, daß ich gar kein '#include <sendreq.ino>' brauche. :fearful:

Mal ne "dumme" Anfängerfrage zu diesem Thema:

kann ich auf diese Weise auch unterschiedliche Programme in einer Software zusammenfassen und auswählen ?

Also würde ich ein "Hauptprogramm" erstellen, in dem ich nur per Tastendruck einmal "erstesprogramm.INO" oder "zweitesprogramm.INO" starte ?

hi,

Du kannst auf tastendruck mal in den einen teil Deines programm springen, dann in den anderen. ob sich diese teile in einer datei oder in zwei verschiedenen befinden, macht technisch keinen unterschied. aber es kann natürlich übersichtlicher sein.

Beim kompilieren faßt der IDE beide Files zusammen.

es ist so, als hättest Du es in einem geschrieben.

gruß stefan

Wenn Du verschiedene Programmteile aktivieren willst dann definiere eine Statusvariable und füre über eine IF oder Switch case Abfrage die Programmteile aus.
Grüße Uwe