RoboterSindCool
30.12.2016, 12: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
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