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

Thema: Über Uart Kommandos auswerten

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.01.2008
    Ort
    Siegen, Germany, Germany
    Beiträge
    441

    Über Uart Kommandos auswerten

    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen,

    ich bin derzeit damit beschäftigt ein kleines "Protokoll" zu schreiben, das es mir ermöglicht über RS232 Schnittstelle Befehle an den Mikrocontroller zu senden.

    Ein Befehl hat derzeit die Form: c123;
    Das abschließende Zeichen ist also ';'
    Es soll später einmal ein Wert auf den integer Wert '123' gesetzt werden.

    Ich habe mir gedacht gut, ich mache mir einen kleinen Buffer und zähle die aktuelle Position mit, das funktioniert soweit auch ganz gut, nur treten seltsame Dinge auf. Zum einen werden einige Ausgaben mehrfach ausgegeben und sobald ich eine Eingabe gemacht habe und er mir das Ergebnis angezeigt hat, funktionieren weitere Ausgaben nicht mehr. Es kommt nur noch "Befehl wurde abgeschlossen".

    Bin da so langsam mit meinem Latein am Ende, vielleicht entdeckt ihr ja den Denkfehler.
    Ich verwende die UART Lib von Peter Fleury.
    Code:
    #define BUFFER_SIZE 128
    
    unsigned char buffer[BUFFER_SIZE];
    unsigned char buffer_temp[BUFFER_SIZE];
    unsigned char buff_ptr = 0;
    
    while(1) {
    c = uart_getc();
            if (c & UART_NO_DATA)
            {    
    
            
            }
            else
            {
                
                buffer[buff_ptr] = (unsigned char)c;
                if (++buff_ptr >= BUFFER_SIZE)
                {
                    buff_ptr = 0;
                }
    
                if (buffer[buff_ptr-1] == ';')
                {
                    uart_puts("Befehl wurde abgeschlossen \n");
                    uart_puts("Buffer Zaehler: ");
                    uart_puts(itoa( buff_ptr, s, 10));
                    uart_puts("\n");
                    // Buffer kopieren
                    for (int i=0; i < BUFFER_SIZE; i++)
                    {
                        buffer_temp[i] = buffer[i];
                    }
    
                    // Kommando auswerten
                    if (buffer_temp[0] == 'c')
                    {
                        char iTemp[3];
                        // Zalen auslesen
                        for (int i=0; i<3; i++)
                        {
                            iTemp[i] = buffer_temp[i+1];
                        }
                        int a;
                        a = atoi(iTemp);
                        uart_puts("Zahlenwert lautet: ");
                        uart_puts(itoa( a, s, 10));
                        uart_puts("\n");
                    }
                    // Buffer löschen
                    buff_ptr = 0;
                    for (int i=0; i < BUFFER_SIZE; i++)
                    {
                        buffer[i] = 0;
                    }
                }
    }
    }
    liebe Grüße
    Der Daniel
    -
    Meine Projektseite:
    http://projects.weber-itam.de

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Wie machst du die Eingaben, mit einem Terminal-Programm? Schließt du dort die Eingabe mit <Return> ab? Dann wäre dieses
    sobald ich eine Eingabe gemacht habe und er mir das Ergebnis angezeigt hat, funktionieren weitere Ausgaben nicht mehr. Es kommt nur noch "Befehl wurde abgeschlossen".
    schon mal nachvollziehbar.

    Aber was meinst du hiermit:
    Zum einen werden einige Ausgaben mehrfach ausgegeben
    Was genau wird wann mehrfach ausgegeben?

    PS: Der doppelte Puffer macht hier keinen Sinn. Wozu soll der gut sein?
    MfG
    Stefan

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.01.2008
    Ort
    Siegen, Germany, Germany
    Beiträge
    441
    Hallo Stefan,

    die Eingabe wird durch ein Enter abgeschlossen (C# mit WriteLine()).

    Wenn ich als Bsp. "c123;" eingebe, dann bekomme ich im Terminal folgende Ausgabe
    Code:
    Befehl wurde abgeschlossen 
    Befehl wurde abgeschlossen 
    Buffer Zaehler: 6
    Befehl wurde abgeschlossen 
    Buffer Zaehler: 6
    Zahlenwert lautet: 123
    der doppelte Buffer sollte den Sinn haben, falls neue Zeichen eingehen während die Verarbeitung läuft, der Buffer nicht zerschossen wird aber du hast recht, kann ja gar nicht passieren. Somit ist der doppelte Buffer tatsächlich Unsinn.


    Edit:
    So habe das mal im Terminal Programm unter C# mit der Funktion Write() versucht, das funktioniert einwandfrei.
    Geändert von daniel.weber (30.03.2011 um 17:24 Uhr)
    liebe Grüße
    Der Daniel
    -
    Meine Projektseite:
    http://projects.weber-itam.de

Ähnliche Themen

  1. Über UART empfangener Text auswerten in einer If-Schlaufe
    Von Barracuda_cy im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 19
    Letzter Beitrag: 30.07.2009, 21:03
  2. AVISARO WLAN verschluckt at kommandos
    Von aphex-world im Forum Elektronik
    Antworten: 8
    Letzter Beitrag: 26.09.2008, 18:13
  3. Über RS232 Wort Empfangen und auswerten
    Von winke im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 3
    Letzter Beitrag: 19.08.2006, 21:30
  4. PWM vom ADXL im Atmega8 auswerten über ICP1 (PB0)
    Von Grave80 im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 01.08.2006, 22:16
  5. Uart Receiver daten speichern und auswerten wie mach ich das
    Von malius im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 05.06.2005, 10:34

Berechtigungen

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

12V Akku bauen