PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Dialog mit RP6 über USART



PocketPc
25.04.2010, 20:38
Folgendes Problem.

Ich möchte eine Dialogbox schreiben wie die von Selftest.
Bei C gibt es ja die scanf funktion um Daten einzulesen und Printf um welche zu schreiben.

Beim RP6 gibt es writeString um daten zu schreiben aber lesen ... an meinem Beispiel kann man sehen was ich meine.




#include "RP6RobotBaseLib.h" // The RP6 Robot Base Library.

uint8_t frag = 0;

void frage_eins (void)
{
writeString("Ich bin Frage eins\n");
}

void frage_zwei (void)
{
writeString("Ich bin Frage zwei\n");
}

int main(void)
{
initRobotBase();

setLEDs(0b111111);
mSleep(500);
setLEDs(0b000000);

writeString("Hallo Drück Taste für eine Frage\n");
writeString(" 1 - Frage eins \n");
writeString(" 2 - Frage zwei \n");

while(true)
{
switch(frag)
{
case 1:
frage_eins();
break;
case 2:
frage_zwei();
break;
}
//"Hier fehlt jetzt was"
//"unter C schaut es so aus"
scanf("%d",&frag);

}
return 0;
}


Danke für Anregungen zur Lösung.

Dirk
25.04.2010, 23:01
Hi PocketPc,

ich bin nicht ganz sicher, was du machen willst.

Wenn es darum geht, ein Zeichen über UART einzulesen, dann zeigt ja das Example_Hallo_01.c, wie das geht.

Gruß Dirk

PocketPc
25.04.2010, 23:52
Die Example_Hallo_01.c hab ich leider nicht. Kannst du mir bitte den Quellcode posten.

Es geht darum das ich mir ein Menü bauen will über das ich durch drücken von Taste 1 - 9 die jeweiligen Programme ausführen kann.

Wie in der RP6Base_SELFTEST. Drücke 0 für alle Tests, 1 für PowerOnTest 2 für ACS usw.

Also ein kleines Interface das ich dann über den Loader steuern kann.

Thx und gute Nacht

_|Alex|_
26.04.2010, 07:55
die Progarmme findest du hier http://www.arexx.com/rp6/html/de/docs.htm
Lg ALex

PocketPc
26.04.2010, 08:33
Wo denn da?

Beispielprogramme (20080915) die hab ich mir schon geladen da ist aber keine Example_Hallo_01.c enthalten.

Dort gibt es nur die Example_01_LEDs. Da wird zwar ein Hallo geschrieben und das Licht leuchtet aber es wird leider kein Dialog ausgeführt.

Kann mir Jemand den Quellcode Posten von der Example_Hallo_01.c
ich glaub das hilft mir dann schon weiter.

Dirk
26.04.2010, 10:06
Sorry, das wird wirklich nicht mitgeliefert ... O:)

Example_Hallo_01.c :

/*
* ************************************************** **************************
* RP6 ROBOT SYSTEM - ROBOT BASE EXAMPLES
* ************************************************** **************************
* Example: Ask for user's name
* Author(s): Dirk
* ************************************************** **************************
* Description:
* This sample program shows how to use the RP6Library functions to receive
* data with the serial interface. It asks for the user's name.
*
* ################################################## ##########################
* The Robot does NOT move in this example! You can simply put it on a table
* next to your PC and you should connect it to the PC via the USB Interface!
* ################################################## ##########################
* ************************************************** **************************
*/

/************************************************** ***************************/
// Includes:

#include "RP6RobotBaseLib.h" // The RP6 Robot Base Library.
// Always needs to be included!

/************************************************** ***************************/
// Ask for the user's name

/**
* Here we ask for the user's name and receive the answer from the user.
* The function uses some of the reception routines of the RP6Library.
* It is called from the main loop (s. below).
*/
void askAQuestion(void)
{
uint8_t charsToReceive;

writeString_P("Wie heisst du? (max. 32 Zeichen)\n");
charsToReceive = 32; // we want to receive maximum 32 characters

// ------------------------------------------
// Receive Answer (UPDATED - this was changed for compatibility with new RP6Lib):

char receiveBuffer[charsToReceive+1]; // our reception buffer is one byte larger
// than the data we want to receive, because
// we also need to receive the "Newline" character!

clearReceptionBuffer(); // Make sure reception Buffer is empty and no junk data
// is left in it.

uint8_t buffer_pos = 0;
while(true) // Loop until we received one line of Data!
{
if(getBufferLength()) // Check if we still have data (means getBufferLength()
{ // is not zero)
receiveBuffer[buffer_pos] = readChar(); // get next character from reception buffer
if(receiveBuffer[buffer_pos]=='\n') // End of line detected!
{
receiveBuffer[buffer_pos]='\0'; // Terminate String with a 0, so other routines.
buffer_pos = 0; // can determine where it ends!
// We also overwrite the Newline character here.
break; // We are done and can leave reception loop!
}
else if(buffer_pos >= charsToReceive) // IMPORTANT: We can not receive more
{ // characters than "charsToReceive" because
// our buffer wouldn't be large enough!
receiveBuffer[charsToReceive]='\0'; // So if we receive more characters, we just
// stop reception and terminate the String.
writeString_P("\n\nDu hast mehr Zeichen als erlaubt eingegeben!\n");
break; // We are done and can leave reception loop!
}
buffer_pos++;
}
}
writeChar('\n');
// ------------------------------------------
// Do something with the received answer:

// Question: What's your name?
writeString_P("Hallo \"");
writeString(receiveBuffer); // Output the user's name as a String
writeString_P("\" !\n");
}

/************************************************** ***************************/
// Main function - The program starts here:

int main(void)
{
initRobotBase(); // Always call this first! The Processor will not work
// correctly otherwise.

setLEDs(0b111111); // Turn all LEDs on
mSleep(500); // delay 500ms
setLEDs(0b000000); // All LEDs off

// Write a message to UART:
writeString_P("\nHallo! Mein Name ist RP6!\n\n");

askAQuestion(); // Ask for the name and write it to UART

writeString_P("\nDas war's! Hier ist das Programm zuende!\n\n");
while(true) {
}; // Here we rest in peace!
// ---------------------------------------

return 0;
}

/************************************************** ***************************/
// EOF


Gruß Dirk

PocketPc
26.04.2010, 10:44
Dank dir.

Schaut gut aus. Wenn es hinhaut melde ich mich wieder.

PocketPc
26.04.2010, 18:26
@Dirk Ich versteh es nicht.

Folgendes aus der Doku:

Einzeln empfangene Bytes kann man mit der Funktion !!! char redChar(void) !!! aus dem Ringpuffer lesen.

genau das will ich machen. Ich sende dem RP6 über das Terminal eine 1 oder 2,3.... und er gibt sie aus bzw kann sie weiter verarbeiten.

writeString(receiveBuffer); // Output the user's name as a String //
Da wird in der Hallo_1.c die Eingabe verarbeitet.

Wie komme ich da ran um sie dann in einem switch(receiveBuffer) oder if(receiveBuffer == 1) zu verarbeiten ???

PocketPc
26.04.2010, 19:21
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=49464&highlight=readchar

Sufu sei dank. Hat sich erledigt.

Schnully2018
17.03.2019, 14:35
Hallo :p

Kann mir jemand ein simples BSP geben damit ich dies verstehe. Ich dachte ganz einfach an:

Bitte geben Sie die Zahl 1 ein: und nun die 2 Zahl

und dann writeString_P Ausgabe Zahl1 u. Zahl2

Dann komme ich weiter.:cry:

Besten Dank

Schnully

Dirk
14.04.2019, 12:35
Du kannst die Funktion
askAQuestion() aus meinem Post #6 zweimal nehmen, um die beiden Zahlen abzufragen.
Dann kannst du sie mit
writeString() wieder per UART ausgeben.