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
aufteilung von code in verschiedene dateien
27.03.2014, 08:38
Beitrag #1
aufteilung von code in verschiedene dateien
Ich hab mir ein Arduino Ethernet gekauft. Ich wollte jetzt die Ethernet Kommunikation in einem anderen Tab implementieren, bzw. mittels c header und implementations Datei. ich hab jetzt schon einige Stunden damit verbracht das zum laufen zu bringen und bin langsam am verzweifeln. Egal welche Kombination ich ausprobiere, es geht nicht.

Am erfolgreichsten war ich bis jetzt damit einen eigene header Datei als neuen Tab anzulegen und dort drin die Libraries mit "" und den Kompleten Pfad einzubinden. Dann diese Header Datei in die hauptdatei.ino auch mit "" einbinden.

was mich besonders erstaunt hat ist das wenn ich keinen zweiten Tab benutze, und die Libraries in der Hauptdatei einbinde, funktioniert es mit include <lib name.h> aber mit include "kompleter Pfad lib name.h" funktioniert es nicht. Ich bekomme zwar keine "xy does not name a type" Fehlermeldung, aber dafür eine "undefined reference to xy"

----nachtrag----

so ich hab jetzt noch etwas rumgegooglet und herausgefunden dass es wohl oder über so ist, dass man alle libraries die man in den eigenen libraries braucht, in den main sketch includen muss. Für den compiler irgendwie.

Ich habes jetzt mal geschaft definitionen in eine header datei auszulagern und diese in den main sketch einzubinden. Das Funktioniert soweit aber sobald ich in der zur header gehörenden .cpp file eine Funktion definiere, bekomme ich "unsinnige" fehlermeldungen wie :
Code:
communication.cpp.o: In function `any_function(int)':
C:\Users\lucasa\AppData\Local\Temp\build7902041112851803674.tmp/communication.cpp:4: multiple definition of `ip'
ChatServer.cpp.o:(.bss.ip+0x0): first defined here
communication.cpp.o: In function `any_function(int)':
C:\Users\lucasa\AppData\Local\Temp\build7902041112851803674.tmp/communication.cpp:4: multiple definition of `gateway'
ChatServer.cpp.o:(.bss.gateway+0x0): first defined here
communication.cpp.o: In function `any_function(int)':
C:\Users\lucasa\AppData\Local\Temp\build7902041112851803674.tmp/communication.cpp:4: multiple definition of `subnet'
ChatServer.cpp.o:(.bss.subnet+0x0): first defined here
communication.cpp.o: In function `any_function(int)':
C:\Users\lucasa\AppData\Local\Temp\build7902041112851803674.tmp/communication.cpp:4: multiple definition of `server'
ChatServer.cpp.o:(.bss.server+0x0): first defined here
communication.cpp.o:(.data.mac+0x0): multiple definition of `mac'
ChatServer.cpp.o:(.data.mac+0x0): first defined here
communication.cpp.o: In function `any_function(int)':
C:\Users\lucasa\AppData\Local\Temp\build7902041112851803674.tmp/communication.cpp:4: multiple definition of `alreadyConnected'
ChatServer.cpp.o:(.bss.alreadyConnected+0x0): first defined here

Hier ist der Code:
ChatClient.ino:
Code:
/*
Chat  Server
Arduino example file
*/

#include <SPI.h>
#include <Ethernet.h>
#include "communication.h"



void setup() {
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.begin(9600);
   while (!Serial) {
    int back = any_function( 4 );
  }

  Serial.print("Chat server address:");
  Serial.println(Ethernet.localIP());
}

void loop() {

  EthernetClient client = server.available();

  if (client) {
    if (!alreadyConnected) {
      client.flush();    
      Serial.println("We have a new client");
      client.println("Hello, client!");
      alreadyConnected = true;
    }

    if (client.available() > 0) {
      char thisChar = client.read();
      server.write(thisChar);
      Serial.write(thisChar);
    }
  }
}

communication.h:
Code:
#ifndef COMMUNICATION_H
#define COMMUNICATION_H

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 177);
IPAddress gateway(192,168,1, 1);
IPAddress subnet(255, 255, 0, 0);


// telnet defaults to port 23
EthernetServer server(23);
boolean alreadyConnected = false; // whether or not the client was connected previously

int any_function( int val );

#endif

communication.cpp:
Code:
#include "communication.h"


int any_function( int val ){
  int result = val + val;
  return result;
}

Ich währe wirklich sehr froh wenn mir jemand weiterhelfen könnte.
Kann mir jemand einen beispielcode mit eingebundenen header dateien und cpp dateien schicken?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.03.2014, 21:42
Beitrag #2
RE: aufteilung von code in verschiedene dateien
Hallo User17,

lies dir bitte nochmal folgenden Link durch um zu verstehen aus welchem grund Libraries geschrieben werden: http://arduino.cc/en/Hacking/LibraryTutorial
Vorweg, man tut dies nicht um Variablen oder Funktionen die bereits in den Standard-Libs vorhanden sind nochmals zu definieren.
Ich habe mir mal deine Codes angesehen und angepasst, sowie mit Kommentaren versehen. So sollte man verstehen, warum ich wie bestimmte Dinge geschrieben habe.
Sketch
Code:
#include <Ethernet.h>
#include <SPI.h>
#include <communication.h>
// Klasseninstanz erstellen um später die Funktion any_function nutzen zu können
Communication Communication;
// Da alreadyConnected und EthernetServer bereits in der Ethernet-Lib deklariert sind,
// können Sie nicht nochmal in der Communication-Lib deklariert werden
// Daher nur deren Benutzung im Sketech
boolean alreadyConnected = false; // whether or not the client was connected previously
EthernetServer server= EthernetServer(23);
void setup() {
  int back;
  // Die Parameter mac, ip, gateway, subnet werden in der Communication.h gesetzt
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.begin(9600);
  while (!Serial) {
    // Aufruf von any_function aus der Klasse Communication
    back=Communication.any_function( 4 );
  }
  Serial.print("Chat server address:");
  Serial.println(Ethernet.localIP());
}
void loop() {
  EthernetClient client = server.available();
  if (client) {
    if (!alreadyConnected) {
      client.flush();    
      Serial.println("We have a new client");
      client.println("Hello, client!");
      alreadyConnected = true;
    }
    if (client.available() > 0) {
      char thisChar = client.read();
      server.write(thisChar);
      Serial.write(thisChar);
    }
  }
}
Communication.h
Code:
#ifndef COMMUNICATION_H
#define COMMUNICATION_H
#include "Arduino.h"
// Muß hier nochmal rein, da IPAddress in Ethernet-Lib dekalriert wird
#include "Ethernet.h"
// Statische Werte müssen außerhalb der Klasse deklariert werden
static byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
static IPAddress ip(192,168,1, 177);
static IPAddress gateway(192,168,1, 1);
static IPAddress subnet(255, 255, 0, 0);
// Klasse Communication
class Communication
{
public:
    // Klassenkonstruktor
    Communication();
    // die eigene Funktion in der Klasse
    int any_function(int val);
    // Da Wert außerhalb der Klasse benutzt wird ist dieser Public
    int _val;
};
#endif
Communication.cpp
Code:
#include "Arduino.h"
#include "Communication.h"
// Der Klassenkonstruktor ohne eigentliche Funktion - Nur Klasseninstanz im Sketch erstellen
Communication::Communication() {;}
// Die eigene Funktion innerhalb der Klasse
int Communication::any_function( int val )
{
  int result = val + val;
  _val= result;
}
keywords.txt
Code:
// Hervorhebung von zur Klasse zugehörigen Funktionen und des Konstruktors im Sketch
Communication    KEYWORD1
any_function    KEYWORD2
Ist im übrigen ein interessantes Thema. Bei richtiger Anwendung kann man die eigentlichen Sketche recht klein halten.

Hope it helps!

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.03.2014, 07:48 (Dieser Beitrag wurde zuletzt bearbeitet: 28.03.2014 08:17 von User17.)
Beitrag #3
RE: aufteilung von code in verschiedene dateien
Hallo Ricardo

Danke für deine Antwort und die Mühe.


Deine Lösung sieht sehr vielversprechend aus, ich werde es noch umsetzen.
Aber wir programmieren noch nicht OO, das projekt soll in reinem C sein.

Du hast jetzt ja Klassen verwendet. Kann ich dass auch ohne Klassen genau gleich machen?

------Nachtrag------
Es hat geklapt Smile
Was ich C mässig verkackt habe war das schlüsselwort static. Soviel ich weis wird das aber als default angegeben, sprich wenn man nichts schreibt ist es static wenn ich in Xcode C99 programmiere.
Der Funktionsprototyp darf darf aber nicht static sein, muss das nochmals nachlesen, es gibt da ja mein einen den default wert static und beim anderen extern.
Die <> und "" verwende ich etwas anders als du. Hier ist der Code.

main sketch:
Code:
#include <SPI.h>
#include <Ethernet.h>
#include "communication.h"


void setup() {
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.begin(9600);
   while (!Serial) {
    int back = any_function( 4 );
  }

  Serial.print("Chat server address:");
  Serial.println(Ethernet.localIP());
}

void loop() {

  EthernetClient client = server.available();

  if (client) {
    if (!alreadyConnected) {
      client.flush();    
      Serial.println("We have a new client");
      client.println("Hello, client!");
      alreadyConnected = true;
    }

    if (client.available() > 0) {
      char thisChar = client.read();
      server.write(thisChar);
      Serial.write(thisChar);
    }
  }
}

communication.h:
Code:
#ifndef COMMUNICATION_H
#define COMMUNICATION_H

#include <Arduino.h>
#include <Ethernet.h>

static byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
static IPAddress ip(192,168,1, 177);
static IPAddress gateway(192,168,1, 1);
static IPAddress subnet(255, 255, 0, 0);

static int zahl = 3;
// telnet defaults to port 23
static EthernetServer server(23);
static boolean alreadyConnected = false; // whether or not the client was connected previously

int any_function( int val );

#endif

communication.cpp
Code:
#include <Arduino.h>
#include "communication.h"


int any_function( int val ){
  int result = zahl + val;
  return result;
}

Ich wollte schon aufgaben und alles in ein sketch machen xD
Es compiliert jetzt ohne fehlermeldung, aber das heist ja nicht das es auch wirklich funktioniert oder? Denkst du es sollte auf einem Arduino laufen?


Gruss
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.03.2014, 17:35
Beitrag #4
RE: aufteilung von code in verschiedene dateien
Hallo User17,

vom Grundsatz geht es natürlich auch ohne Klassen. Die sind "nur" da um Funktionen (im Sketch aufgerufen) und zugehörige Variablen zu bündeln und bestimmten "funktionalen Themen" zuzuordnen. Man kann ja auch mehrere Klassen in eine Library schreiben, die ganz unterschiedliche Aufgaben abdecken.

Generell hat das dann aber nix mit OO-Programmierung zu tun, Dazu fehlen die dort üblichen Klassenbestandteile Objekt, dessen Eigenschaftenen und zugehörige Ereignisse die dann Methoden anstoßen.

Weil dem so ist, kann man auf dem Arduino zB. keine "parallele" Abarbeitung von Code/Methoden anstoßen.

Deine aktuelle Version wird erstmal ohne Fehler kompiliert. Ob er das macht was er soll, kann ich allerdings nicht sagen. In beiden Versionen komme ich bis zur Ausgabe der ChatServer-IP auf Serial.
Kleiner Tipp: als Netzwerkmaske passt besser "255.255.255.0" zu dem Adressbereich.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Einfacher Tacho für niedrige Geschwindigkeiten – Code optimieren Bastelo 2 259 12.10.2016 20:31
Letzter Beitrag: Bastelo
  Code mit Verifikation über Keypad & LCD machnetz 5 215 10.10.2016 15:01
Letzter Beitrag: torsten_156
  Wo kann ich hier noch Code spahren? (SPI-,Ethernet-,SD-,GSM-Library) avoid 4 377 05.06.2016 14:16
Letzter Beitrag: avoid
  Serial Monitor Eingabe über Code Maxi290997 4 519 12.05.2016 18:57
Letzter Beitrag: SkobyMobil
  Problem: RFID code mit Inhalt einer Textdatei auf einer SD Karte vergleichen MartinK 6 505 29.03.2016 16:45
Letzter Beitrag: MartinK
  OSC Arduino Code Fabian_Fabian 5 431 10.03.2016 23:23
Letzter Beitrag: hotsystems
  Code bei fritzing Miro 3 1.366 08.02.2016 16:16
Letzter Beitrag: Uwa
  Code für Würfel korrekt? JanGamer11 12 805 12.01.2016 19:41
Letzter Beitrag: Claus_M
  Programm Code Erweitern hugolost 8 659 01.01.2016 20:02
Letzter Beitrag: Bitklopfer
  Jeffs 4-Way Button Code auf Arduino Leonardo? noxx 17 1.308 16.11.2015 20:30
Letzter Beitrag: noxx

Gehe zu:


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