- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 8 von 8

Thema: Einfache Kommunikation zwischen rp6 und pc

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    22.09.2008
    Ort
    Mönchengladbach
    Alter
    34
    Beiträge
    36

    Einfache Kommunikation zwischen rp6 und pc

    Anzeige

    Powerstation Test
    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

    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

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    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
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    22.09.2008
    Ort
    Mönchengladbach
    Alter
    34
    Beiträge
    36
    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:
    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);
    	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;
    }

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Ich bin auch verwirrt, irgendwie scheint der Lesebuffer der UART-LIB nicht richtig zu funktionieren:
    Code:
    #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:
    Code:
    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
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    22.09.2008
    Ort
    Mönchengladbach
    Alter
    34
    Beiträge
    36
    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 ich werde mich jetzt ers mal mit was anderem befassen bin aber weiter für lösungen offen ^^

    christian

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    22.09.2008
    Ort
    Mönchengladbach
    Alter
    34
    Beiträge
    36
    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

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    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

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    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:
    Code:
    #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:
    Code:
    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
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests