PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Kommunikation zweier Asuros: Datentransfer mit Fehlern...



Crysers
06.06.2012, 14:44
Hallo, Ich bin Julian und neu hier im Forum.
Zur Zeit habe ich ein Projekt mit dem Asuro, bei dem ich zwei Ausros untereinander via Bluetooth kommunizieren lassen möchte. Die Verbindung mit Bluetooth steht bereits.
Der eine Asuro soll eine Linie verfolgen und dabei seine Geschwindigkeitswerte an den zweitesch schicken. Dieser soll dann zeitgleich parallel zum ersten Asuro das gleiche Linienmuster fahren. Dies nur mittels der empfangenen Daten.
Die Linienverfolgung klappt recht gut. (ist auch eine sehr einfache Verfolgung^^). Der zweite Asuro jedoch erhält nur manchmal die Richtungsänderung und fährt somit lange im Kreis bzw. völlig falsch....
Hat jemand eine Idee, woran dies liegen könnte? Kann es sein, dass es mit den Sendezeiten Probleme gibt? Also dass der zweite die daten nicht richtig empfängt, weil sich sendung und empfang sich direkt überschneiden?

Hier mal der Quelltext:
Linienverfolger:


#include <asuro.h>

int main() {
Init();

unsigned int data[2];
unsigned int SpeedLinks,SpeedRechts;
char SndBuf[2];
FrontLED(ON);
while(1){
LineData(data);
if (data [0] > 50 ) { // neben der linie
SpeedLinks=33;
SpeedRechts=175;
MotorSpeed(SpeedRechts,SpeedLinks);
SerWrite('R',1);
}
else { // Korrektur, um auf die Linie zurückzukommen
SpeedLinks=175;
SpeedRechts=33;
MotorSpeed(SpeedRechts,SpeedLinks);
SerWrite('L',1);
}
};
return(0);
}



zweiter Asuro:



#include <asuro.h>

int main(void) {
Init();
char RecBuf[1];
int SpeedRechts;
int SpeedLinks;
MotorSpeed(0,0);
MotorDir(FWD,FWD);

while(1) {
StatusLED(RED);
SerRead(RecBuf,1,0);
if (RecBuf[0]=='L') {
SpeedLinks=175;
SpeedRechts=33;
MotorSpeed(SpeedRechts,SpeedLinks);
}
if (RecBuf[0]=='R') {
SpeedLinks=33;
SpeedRechts=175;
MotorSpeed(SpeedRechts,SpeedLinks);
}
}
return (0);
}



Schonmal Danke für eure Hilfe:)

radbruch
06.06.2012, 20:29
Hallo

Nette Idee. Vielleicht wird es so besser:


#include <asuro.h>

int main(void) {
Init();

unsigned int data[2];
unsigned int SpeedLinks,SpeedRechts;
char SndBuf[2], Richtung=0;
FrontLED(ON);
while(1){
LineData(data);
if (data [0] > 50 ) { // neben der linie
SpeedLinks=33;
SpeedRechts=175;
MotorSpeed(SpeedRechts,SpeedLinks);
if(!(Richtung == 'R')) {
SerWrite('R',1);
Richtung='R';
}
}
else { // Korrektur, um auf die Linie zurückzukommen
SpeedLinks=175;
SpeedRechts=33;
MotorSpeed(SpeedRechts,SpeedLinks);
if(!(Richtung == 'L')) {
SerWrite('L',1);
Richtung='L';
}
}
}
return(0);
}(Ungetestet)

Gruß

mic

Crysers
07.06.2012, 15:01
Erstmal danke für den Vorschlag. Klang auf jeden Fall logisch. Jedoch funktionierte dies auch nicht ganz korrekt.
Ich hab es jetzt selbst soweit hinbekommen, dass es funktioniert.


...
while(1){
LineData(data);
if (data [0] > 50 ) { // neben der linie
SpeedLinks=33;
SpeedRechts=175;
MotorSpeed(SpeedRechts,SpeedLinks);
if(!(SndBuf[0] == 'R')) {
SndBuf[0]='R';
SerWrite(SndBuf,1);

}
}
else { // Korrektur, um auf die Linie zurückzukommen
SpeedLinks=175;
SpeedRechts=33;
MotorSpeed(SpeedRechts,SpeedLinks);
if(!(SndBuf[0] == 'L')) {
SndBuf[0]='L';
SerWrite(SndBuf,1);

}
}
Msleep(5);
...


Wichtig ist dabei das Msleep am ende. Ohne diesem Sendet er daten mehrmahls und auch falsch...
Am zweiten habe ich nichts verändert...
Nun funktioniert alles soweit wie ich es wollte. Lediglich dass die Geschwindigkeiten der beiden nicht richtig übereinstimmen...

vielen dank, Julian