PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einfache Kommunikation zwischen rp6 und pc



-Lookup-
27.09.2008, 15:31
Guten tag ers ma an alle.
Ich zweifle langsam an meinem verstand....
Ich habe ein warscheinlich sehr simples problem und zwar möcht ich einfach daten an den rp6 schicken und er soll mir sie zurück schicken.
Mein code gibt aber ersteinmal garnichts zurück und wenn ich dann die start/stop taste drücke nur einen teil hier ist mein code


#include "RP6RobotBaseLib.h"


char eingang[15];

void empfangen(void)
{

writeString_P("Bitte etwas eingeben -max 10 Zeichen-");


int i= getBufferLength();

writeChar('\n');
writeInteger(i,DEC);
readChars(eingang,10);
for(int x=0;x>=5;x++)
writeChar(eingang[x]);


}




int main(void)
{
initRobotBase(); // Initialisierung – IMMER ALS ERSTES AUFRUFEN!
powerON();

empfangen();

while(true)
{




} // Endlosschleife
return 0;
}

Ich wäre sehr dankbar für ein einfaches beispiel.

PS : Ja ich weiß das es dazu ein beispiel auf der cd gibt aber das ist mir zu undurchsichtig als anfänger.

gruß christian

radbruch
27.09.2008, 16:00
Hallo

Ich hab's nur kurz überflogen, aber müßte es nicht

for(int x=0;x<=5;x++)

lauten? Und am Ende der Ausgabe noch ein writeString_P("\n\r"); sonst wird die Ausgabe erst nach einem Rest sichtbar.

Gruß

mic

-Lookup-
27.09.2008, 16:10
mti der for schleife gebe ich dir recht aber was bewirkt denn das \r ?


EDIT:
Er gbit nur kleine vierecke aus ^^ es sieht so aus als wäre der string leer und wenn ich getBufferLength(); aufrufe steht dort auch nichts drin bis jetzt sieht der code so aus:


#include "RP6RobotBaseLib.h"


char eingang[15];

void empfangen(void)
{

writeString_P("Bitte etwas eingeben -max 10 Zeichen-");


int i= getBufferLength();

writeChar('\n');
writeInteger(i,DEC);
writeString_P("\n\r");

do
{
readChars(eingang,10);
}while(readChar()!='\n');

for(int x=0;x<=getBufferLength();x++)
{

writeChar(eingang[x]);

}
writeString_P("\n\r");


}




int main(void)
{
initRobotBase(); // Initialisierung – IMMER ALS ERSTES AUFRUFEN!
powerON();

empfangen();

while(true)
{




} // Endlosschleife
return 0;
}

radbruch
27.09.2008, 17:39
Hallo

Ich bin auch verwirrt, irgendwie scheint der Lesebuffer der UART-LIB nicht richtig zu funktionieren:


#include "RP6RobotBaseLib.h"


char eingang[15];

int main(void)
{
char i;

initRobotBase(); // Initialisierung – IMMER ALS ERSTES AUFRUFEN!
powerON();

while(true)
{
writeString_P("Bitte etwas eingeben -max 10 Zeichen-");
writeString_P("\n\r");

i=0;
do
{
while(!getBufferLength()); //warten solange keine Zeichen im Buffer
while(getBufferLength()) // Zeichen aus Buffer einlesen
eingang[i++]=readChar();
}while(i==0);

eingang[i]=0; // Endekennung String nach letztem Zeichen
writeString(eingang);
writeString_P("\n\r");
} // Endlosschleife
return 0;
}


Die Ausgabe dazu:


Terminal cleared!

s

Bitte etwas eingeben -max 10 Zeichen-
# 1

1

Bitte etwas eingeben -max 10 Zeichen-



Bitte etwas eingeben -max 10 Zeichen-
# 12

1

Bitte etwas eingeben -max 10 Zeichen-

2


Bitte etwas eingeben -max 10 Zeichen-
# 1234

1

Bitte etwas eingeben -max 10 Zeichen-

234


Bitte etwas eingeben -max 10 Zeichen-
# 1234567890

1

Bitte etwas eingeben -max 10 Zeichen-

234567890


Bitte etwas eingeben -max 10 Zeichen-

Aber ich kenne mich damit nicht wirklich aus. Vielleicht mal eine aktuellere Lib installieren? Es gab da mal ein Update beim Zeicheneinlesen soweit ich mich erinnere.

Wichtig ist zu wissen, dass der RP6Loader keine einzelnen Zeichen schicken kann (leider) sondern immer die komplette Zeile nach [Return]. Das Hyperterminal kann das aber (mit 34800Baud).

Gruß

mic

-Lookup-
27.09.2008, 20:07
Also das es da ein update gabd as stimmt ich habe die neuste lib eingebunden ich probiere jetzt mal deinen code. Mal sehen obs klapt sons liegts an irgend etwas hier bei mir.



EDIT: Also es klapt habe die gleich ausgabe wie du nur sehr elegant is das ja nicht mh....
Aber danke für deine hilfe O:) ich werde mich jetzt ers mal mit was anderem befassen bin aber weiter für lösungen offen ^^

christian

-Lookup-
30.09.2008, 13:14
Ein frage ist mir jetzt aber doch noch eingefallen wie bekomme ich es hin das ich mit hilfe von zB hyperterminal mit dem rp6 kommunizieren kann. jedes mal wenn ich eine verbindung auf bauen will schaltet der rp6 ab egal mit welchem programm.


Welche verbindungs eigenschaften muss man wählen ich möcht nämlich später dann mit C# eine alternative zum loader schreiben.

Danke schon einmal für die hilfe

SlyD
30.09.2008, 22:12
Hallo,

liegt sicherlich daran, dass HyperTerminal den Pin RTS von der seriellen Schnittstelle auf low setzt. RTS ist nämlich mit dem Reset Pin des Mikrocontrollers verbunden.

Teste es doch erstmal lieber mit HTerm:
http://www.der-hammer.info/terminal/

Hier wie es Konfiguriert werden muss:
http://www.arexx.com/rp6/downloads/HTerm_RP6.gif




Ich bin auch verwirrt, irgendwie scheint der Lesebuffer der UART-LIB nicht richtig zu funktionieren:


Nene der funktioniert schon richtig, ist ein Ringpuffer und wird über einen INTERRUPT aufgefüllt - d.h. asynchron zum restlichen Programm.
D.h. zunächst ist da wirklich nur das erste Zeichen im Puffer, die anderen kommen dann direkt danach, das bekommt dein Programm da oben aber schon nicht mehr mit.
Du könntest aber z.B. ein kleines delay einbauen, oder eleganter auf das Zeilenende warten (\n).



Wichtig ist zu wissen, dass der RP6Loader keine einzelnen Zeichen schicken kann (leider) sondern immer die komplette Zeile nach [Return].


Wenn ich mal irgendwann in ferner Zukunft wieder Zeit hab... ;)

MfG,
SlyD

radbruch
30.09.2008, 22:52
Hallo


Du könntest aber z.B. ein kleines delay einbauen, oder eleganter auf das Zeilenende warten (\n).
Aha, das macht Sinn und funktioniert auch schon besser:



#include "RP6RobotBaseLib.h"

char eingang[15];

int main(void)
{
char i;

initRobotBase(); // Initialisierung – IMMER ALS ERSTES AUFRUFEN!
powerON();

while(true)
{
writeString_P("Bitte etwas eingeben -max 10 Zeichen-");
writeString_P("\n\r");

i=0;
do
{
while(!getBufferLength()); //warten solange keine Zeichen im Buffer
while(getBufferLength()) // Zeichen aus Buffer einlesen
eingang[i++]=readChar();
}while((i<10) && (eingang[i-1] != '\n'));
sleep(50);
clearReceptionBuffer();

eingang[i]=0; // Endekennung String nach letztem Zeichen
writeString(eingang);
writeString_P("\n\r");
} // Endlosschleife
return 0;
}

Die Ausgabe dazu:

Terminal cleared!
Bitte etwas eingeben -max 10 Zeichen-
# 123

123


Bitte etwas eingeben -max 10 Zeichen-
# 1234567890

1234567890


Bitte etwas eingeben -max 10 Zeichen-
# 11223344556677889900

1122334455

Bitte etwas eingeben -max 10 Zeichen-
# juhu

juhu


Bitte etwas eingeben -max 10 Zeichen-


Der Unterschied beim Zeilenvorschub kommt davon dass bei Strings <10 das \n vom Senden auch im String ist. Aber das ist eher ein kosmetischer Fehler...

Gruß

mic