Pages: [1]   Go Down
Author Topic: Auslagern von Programmcode für Anfänger  (Read 1350 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 1
Posts: 353
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley

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:

Code:
#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
 
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

0
Offline Offline
Faraday Member
**
Karma: 19
Posts: 3420
20 LEDs are enough
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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".
Logged

Check out my experiments http://blog.blinkenlight.net

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 235
Posts: 20221
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Sr. Member
****
Karma: 1
Posts: 353
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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"
Code:
#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"
Code:
//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 (0.95 KB - downloaded 7 times.)
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 235
Posts: 20221
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Code:
//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
Logged

Offline Offline
Sr. Member
****
Karma: 1
Posts: 353
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

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

@uwefed:
Zwei *.inos in einem Verzeichnis mag er gar nicht smiley-sad
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.
« Last Edit: July 14, 2012, 04:16:47 am by hk007 » Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Hamburg, Germany
Offline Offline
Sr. Member
****
Karma: 5
Posts: 291
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Sr. Member
****
Karma: 1
Posts: 353
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Offline Offline
Sr. Member
****
Karma: 1
Posts: 353
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 235
Posts: 20221
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Sr. Member
****
Karma: 1
Posts: 353
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ach so.
Nach dem letzten Post hab ich jetzt auch bemerkt, daß ich gar kein '#include <sendreq.ino>' brauche.  smiley-eek-blue
Logged

Arduino 1.0.5 | Arduino UNO & MEGA | Arduino 1.54r2 mit DUE

Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged

Wien
Online Online
Edison Member
*
Karma: 23
Posts: 1658
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Quote
Beim kompilieren faßt der IDE beide Files zusammen.

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

gruß stefan
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 235
Posts: 20221
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1]   Go Up
Jump to: