PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Asuro Fernsteuern



Pdd
24.10.2006, 15:18
Hallo.
Ich hab heut mal damit angefangen, ASURO über Hyperterminal fernzusteuern:

while(1)
{
//Befehle Empfangen
msg = "";
SerRead(msg,1,0);
Send("\r\nEmpfangen: >");
Send(msg);
Send("<");
if(msg == "w")
{
FrontLED(ON);
}
}

Die Funktion: Wenn man im Terminal "w" drückt, sollte die Front LED angehen, tut sie aber net o.O
Wie ihr seht sendet der Asuro zu testzwecken die Taste zurück, die angekommen ist. Ankommen sollte: "Empfangen: >w<" Empfangen wird aber :
"Empfangen >w
<"
Also mit einem Zelenumbruch. Nun will ich die Zeile if(msg == "w") so umändern, das nur das erste byte(das "w") verglichen wird. Mit msg[1] funktioniert das aber nicht! Wie kann man das machen?

michael.bend
24.10.2006, 16:01
Hi Pdd,

wenn du die Variable msg initialisierts (machst du doch, oder) kannst du die Länge auf ein Zeichen begrenzen. Das sollte dan dein Problem lösen.


Viele Grüße, (Michael)

Pdd
24.10.2006, 17:29
Hm hab jetzt so:


char msg[1];
while(1)
{
//Befehle Empfangen
msg[1] = "";
SerRead(msg[1],1,0);
Send("\r\nEmpfangen: >");
Send(msg[1]);
Send("<");
if(msg[1] == "w")
{
FrontLED(ON);
}
}


es kommt aber immernoch das selbe raus! Oder begrenzt man die Anzahl anders? nicht dsa ich jetzt ein Array erstellt habe, könnte ich mir vorstellen, weil ein Fehler kommt, wenn man an einem "msg" das "[1]" weglässt. :?:

damaltor
26.10.2006, 12:31
mach mal folgendes:


char msg[1]="x";

so dass schon ein wert gespeichert ist. dieser wird dann später überschrieben. laut anleitung des asuro sollte es so besser gehen.

m.a.r.v.i.n
26.10.2006, 13:22
Hallo Pdd,



char msg[1];


ist ein Vektor bestehend aus 1 Element (hier Byte).



msg[1] = "";


ist eine Zuweisung auf das 2. Element (Byte) des Vektors. Also hinter den Vektor, da dieser ja nur 1 Byte lang ist.
In C wird so etwas nicht überprüft, was zu unerwarteten Effekten führen kann!



msg[0] = "";


wäre richtig (das gleiche gilt bei Vergleichen und als Parameter für Funktionen).

Vielleicht nochmal den Abschnitt über Zeiger und Vektoren in der Asuro Bedienungsanleitung durchsehen.

Gruß m.a.r.v.i.n

damaltor
26.10.2006, 13:26
aaach da war was... na klar =)

das erste element ist 0, das zweite element ist 1 usw...

Danke marvin, war grade wireder am drüber nach grübeln warums net geht =)

Pdd
26.10.2006, 13:40
ok danke, habs schon gestern gelöst gehabt, habs nur net geschreiben *schäm* naja:


char msg[1];
{
//Befehle Empfangen
Send("\r\n>");
SerRead(msg,1,0);
msg[1] = '\0';
Send(msg[0]);

if(msg[0] == 'w')
{
All(ON);
}
else if(msg[0] == "s")
{
All(OFF);
}
}


Wenn man jetzt W drückt, gehen die Lampen an, auf S gehen sie aber nicht mehr aus o.O weis auch net woran das liegt... naja und ausserdem sendet er immer nachrichten zurück, die garnet gesendet werden sollen. statt nur dem Buchstabe sendet er einen ganzen satz, der eigentlich nur 5 zeilen oberhalb dieses ausschnittes einmal gesendet wird!

m.a.r.v.i.n
26.10.2006, 13:53
Hallo Pdd,

dein Array ist immer noch zu kurz, weil Strings noch ein abschließendes \0 Zeichen benötigen.

Also


char msg[2];

nimm mal Hochkommas,


if(msg[0] == 's')

nicht Gänsefüsschen


if(msg[0] == "s")

dann klappt das auch.

Mit


Send(msg);

sollte es auch das Senden klappen

Gruß m.a.r.v.i.n

Pdd
26.10.2006, 14:33
aha, mal probiere, aber komsich, das kein compiler.error kommt. o.O

Pdd
26.10.2006, 14:38
das gibts doch net, mittlerweile kommen Comiler-errors:
MAKE Version 5.2 Copyright (c) 1987, 1998 Inprise Corp.
Error makefile 222: Colon expected
Error makefile 247: Too many rules for target '%.o'
Error makefile 283: Command syntax error
*** 3 errors during make ***

> Process Exit Code: 1

m.a.r.v.i.n
26.10.2006, 14:41
Da hat sich irgendwie das make.exe von Borland reingemogelt. Überprüf mal die Pfadangaben. WinAVR sollte vor Borland stehen.

Gruß m.a.r.v.i.n

Pdd
26.10.2006, 15:49
Jop, das kann sein, hab nähmlich gestern Borland Delphi installiert. Ich werd WinAVR mal neuinstallieren....

Tobi98
25.06.2015, 16:24
Hallo. Ich habe das Programm von Pdd am 26.10.2006, 14:40 abgeschrieben und erweitert mit meinen tastenbelegungen und Aktionen. Jedoch bringt mir das Programm beim compilieren folgendes:
C:\ASURO_src\FirstTry\test.c:6: undefined reference to 'Send'
C:\ASURO_src\FirstTry\test.c:9: undefined reference to 'Send'
Der scheint nichts mit Send anfangen zu können. Ich habe aber irgendwie keinen Plan wie ich dem das beibringen soll...

Hier mein Programm:


#include "asuro.h"
int main(void) {
char msg[2];
{
//Befehle Empfangen
Send("\r\n>");
SerRead(msg,2,0);
msg[1] = '\0';
Send(msg[0]);

if(msg[0] == 'w')
{
MotorDir(FWD,FWD);
MotorSpeed(255,255);
FrontLED(ON);
}
else if(msg[0] == 's')
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
StatusLED(RED);
}
else if(msg[0] == 'd')
{
MotorDir(FWD,FWD);
MotorSpeed(255,150);
BackLED(OFF,ON);
}
else if(msg[0] == 'a')
{
MotorDir(FWD,FWD);
MotorSpeed(150,255);
BackLED(ON,OFF);
}
else if(msg[0] == 'x')
{
MotorDir(FREE,FREE);
MotorSpeed(0,0);
BackLED(ON,ON);
}
else
{StatusLED(YELLOW);}
}
return 0;
}

Valen
25.06.2015, 19:15
Dann ist die einzige Lösung Pdd versuchen die Code der Funktion Send hier zu posten. Weil das aber damals in 2006 war ist er es vermutlich vergessen, oder hat er es nicht mehr. Vermutlich macht das nur ein Anruf von SerWrite mit Tekst-Zeile als Parameter.

Tobi98
25.06.2015, 19:27
Ok danke. Ich probiere einfach mal bisschen rum. Wenn ich fertig bin und alles funktioniert schreibe ich das ergebnis hier rein, damit andere auch ihren asuro fernsteuern können. Das kann aber paar tage dauern XD

radbruch
25.06.2015, 19:42
Hallo

Was passiert da:


//Befehle Empfangen
Send("\r\n>");
SerRead(msg,2,0);
msg[1] = '\0';
Send(msg[0]);

Send("\r\n>"); Es wird ein CRLF an das Terminal gesendet um dort später in einer neue Zeile zu schreiben.
SerRead(msg,2,0); Dann wird eingelesen was das Terminal sendet....
msg[1] = '\0'; ...und dahinter das Zeichen mit der Nummer 0 als Kennung für das Ende einer Zeichenkette gespeichert.
Send(msg[0]); und letzlich wird das eingelesene Zeichen zur Kontrolle zurück zum Terminal gesendet das dieses dann in der neuen Zeile darstellt.

Send() sollte deshalb irgendwie durch SerWrite() ersetzbar sein. Oder du verzichtest auf die Kontrolle im Terminal und wechselst zum Beispiel die Farbe der StatusLED wenn ein neues Zeichen empfangen wurde.

if(msg[0] == 'w') vergleich nur ein Zeichen, die oben angefügte Endekennung für Strings scheint eher unnötig zu sein.

Gruß

mic

Tobi98
25.06.2015, 21:06
Erstmal danke für die vielen Erklärungen. Das hat mir wirklich viel geholfen. Aber was meinst du mit Endkennung für Strings? Sorry, ich bin Anfänger.

radbruch
26.06.2015, 11:55
Das mit den Strings ist für dein Beispiel oben nicht wichtig, aber weil du ja was lernen willst:

http://www.walter-digital.de/c_2_aufbau/pstrings/pstrings.htm
(Es reicht erstmal, wenn du bis Bild 5-4 liest)

In deinem Beispiel wird char msg[2]; verwendet um die Eingabe die vom Terminal empfangen wird zu speichern. msg[] bietet Platz für zwei Bytes. Eines davon (das erste mit Namen msg[0] wird für die Daten vom Terminal verwendet (ein Zeichen belegt 8 Bit und passt deshalb in Variablen vom Type char) und für die Vergleiche mit anderen Zeichen die auch 8 Bit groß sind ('w','s', 'a', 'd' und 'x').

Tobi98
26.06.2015, 21:03
Danke. Jetzt funktioniert es. Zumindest nur ein Teil davon. Ich hab die Kontrolle gleich ganz weggelassen. Wenn ich jetzt aber eine Taste (Tastatur am PC) drücke passiert gar nichts. Und wenn ich dann nochmal eine drücke, wechselt die status LED von grün auf gelb. Danach passiert nichts mehr.



#include "asuro.h"
int main(void) {
char msg[2];
{
SerRead("b",2,0);
msg[1] = '\0';

while(1){

if(msg[0] == 'w')
{
MotorDir(FWD,FWD);
MotorSpeed(255,255);
FrontLED(ON);
}
else if(msg[0] == 's')
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
StatusLED(RED);
}
else if(msg[0] == 'd')
{
MotorDir(FWD,FWD);
MotorSpeed(255,150);
BackLED(OFF,ON);
}
else if(msg[0] == 'a')
{
MotorDir(FWD,FWD);
MotorSpeed(150,255);
BackLED(ON,OFF);
}
else if(msg[0] == 'x')
{
MotorDir(FREE,FREE);
MotorSpeed(0,0);
BackLED(ON,ON);
}
else
{StatusLED(YELLOW);}
}
return 0;}
}

Vielleicht wisst ihr, was da los ist...

Valen
26.06.2015, 21:19
Wie oft wird SerRead angesprochen in dein while loop? Und wie oft werden dan neue Zeichen von dein PC verbindung bekommen? ;)

m.a.r.v.i.n
27.06.2015, 22:22
Hallo,

In deinem Programm fehlt die Init() Funktion zu Beginn des Programmes. Der Aufruf der SerRead() Funktion gehört in die while Schleife, sonst wird nur einmal ein Befehl gelesen.



#include "asuro.h"

int main(void)
{
char msg[2];
Init();


while (1)
{
// fuege hier deinen Code ein
}
return 0;
}

Tobi98
27.06.2015, 22:34
Danke. Ich werds mal versuchen.