PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino selbstgeschriebene Funkbibliothek funktioniert nicht



RoboterSindCool
30.12.2016, 11:24
Hallo Roboternetz,

Ich will mit einem Funksender einen Roboter steuern. Dazu sende ich Daten von einem Joystick an den Roboter. Eigentlich funktioniert auch alles ganz gut. Wenn ich im Roboter diesen Code eingeben dann funktioniert es (Diesen Code will ich dann in eine Bibliothek aussetzten, ganz unten kommt dann das problem):


#include <VirtualWire.h>

int rxPin = 6;


void setup()
{

Serial.begin(9600);


vw_setup(800);
vw_set_rx_pin(rxPin);
vw_rx_start();

}

void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

char SensorDataTemp[VW_MAX_MESSAGE_LEN+1]; // Daten-Variable, die die empfangenen Daten hält
String SensorData; // Daten-Variable, zum Übergeben der Daten an die WebRequest-Funktion

if(vw_get_message(buf, &buflen))
{

memset(SensorDataTemp, 0, VW_MAX_MESSAGE_LEN+1); // Das ganze Array mit Nullen füllen

for (int i = 0; i < buflen; i++)
{
SensorDataTemp[i] = (char)buf[i];
}

SensorDataTemp[VW_MAX_MESSAGE_LEN+1] = '\0'; // Char-Variable terminieren
SensorData = SensorDataTemp; // Char to String-Konvertierung zur Übergabe an die connect()-Funktion

String rechts = getValue(SensorData, ';', 0);
String links = getValue(SensorData, ';', 1);

int geschw_rechts = rechts.toInt();
int geschw_links = links.toInt();


Serial.print(geschw_rechts);
Serial.print("\t");
Serial.println(geschw_links);

}
}



String getValue(String data, char separator, int index){
int found = 0;
int strIndex[] = { 0, -1 };
int maxIndex = data.length() - 1;

for (int i = 0; i <= maxIndex && found <= index; i++) {
if (data.charAt(i) == separator || i == maxIndex) {
found++;
strIndex[0] = strIndex[1] + 1;
strIndex[1] = (i == maxIndex) ? i+1 : i;
}
}
return found > index ? data.substring(strIndex[0], strIndex[1]) : "";
}





Nun würde ich gerne den Completten Code in eine Library aussetzen, dass ich es im Arduino code nicht mehr so kompliziert habe.
Es kommen jetzt Nacheinander die header-datei, dann die cpp- datei und dann die .ino-Datei (Ganz am Schluss kommt das Problem)


HEADER_DATEI:

#include <Arduino.h>
#include <VirtualWire.h>

class BIB_Funk{


private:

int datenPin = 6;
int geschwindigkeit_rechts = 0;
int geschwindigkeit_links = 0;


public:


BIB_Funk();
void datenAktualisieren();
int get_geschwindigkeit_motor_rechts();
int get_geschwindigkeit_motor_links();

String getValue(String data, char separator, int index);
};


CPP_DATEI


#include "BIB_Funk.h"



BIB_Funk :: BIB_Funk(){

vw_setup(800);
vw_set_rx_pin(datenPin);
vw_rx_start();

}


int BIB_Funk :: get_geschwindigkeit_motor_rechts(){
return geschwindigkeit_rechts;
}
int BIB_Funk :: get_geschwindigkeit_motor_links(){
return geschwindigkeit_links;
}


void BIB_Funk :: datenAktualisieren(){


while (true){

uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;

char SensorDataTemp[VW_MAX_MESSAGE_LEN+1]; // Daten-Variable, die die empfangenen Daten hält
String SensorData; // Daten-Variable, zum Übergeben der Daten an die WebRequest-Funktion



if(vw_get_message(buf, &buflen)){

Serial.println("ja ich bin hier");
memset(SensorDataTemp, 0, VW_MAX_MESSAGE_LEN+1); // Das ganze Array mit Nullen füllen

for (int i = 0; i < buflen; i++)
{
SensorDataTemp[i] = (char)buf[i];
}

SensorDataTemp[VW_MAX_MESSAGE_LEN+1] = '\0'; // Char-Variable terminieren
SensorData = SensorDataTemp; // Char to String-Konvertierung zur Übergabe an die connect()-Funktion

String rechts = getValue(SensorData, ';', 0); //damit splittet man den String in die 2 Werte auf (Methode ist unten)
String links = getValue(SensorData, ';', 1);

int geschw_rechts = rechts.toInt();
int geschw_links = links.toInt();


geschwindigkeit_rechts = geschw_rechts;
geschwindigkeit_links = geschw_links;

return;
}

}



}

String BIB_Funk :: getValue(String data, char separator, int index){

int found = 0;
int strIndex[] = { 0, -1 };
int maxIndex = data.length() - 1;

for (int i = 0; i <= maxIndex && found <= index; i++) {
if (data.charAt(i) == separator || i == maxIndex) {
found++;
strIndex[0] = strIndex[1] + 1;
strIndex[1] = (i == maxIndex) ? i+1 : i;
}
}
return found > index ? data.substring(strIndex[0], strIndex[1]) : "";

}


ARDUINO DATEI

void setup() {

Serial.begin(9600);

}

void loop() {

funk.datenAktualisieren();
int geschwindigkeit_rechts = funk.get_geschwindigkeit_motor_rechts();
int geschwindigkeit_links = funk.get_geschwindigkeit_motor_links();

Serial.print(geschwindigkeit_rechts);
Serial.print("\t");
Serial.println(geschwindigkeit_links);

}



DAS PROBLEM:
In der "datenAktualisieren" Methode, bleibt der code immer stecken. Das heißt er kommt nicht mehr aus der while true schleife Heraus. Wobei er auch nicht die die if abfrage if(vw_get_message(buf, &buflen)) hineinkommt. Ich kapier nicht was der unterschied ist, warum es im Arduino Programm funktioniert aber wenn ich es in eine Externe Bibliothek mache dann nicht!

Vielen Dank schon mal für eure Hilfe

RoboterSindCool