- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: ansteuerung mit einem string, der auch gleich daten enthält

  1. #1
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941

    ansteuerung mit einem string, der auch gleich daten enthält

    Anzeige

    Powerstation Test
    "vor120", wie kann ich diesen string trennen in 2 gruppen, einmal einen string "vor" zum aufruf der unterroutine und einmal eine integerzahl 120 , die in der unterroutine verarbeitet wird mit winavr-c
    mfg pebisoft

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.01.2004
    Alter
    35
    Beiträge
    645
    Das gleiche Prob hatte ich vor kurzem in Bascom.
    Da gings mit "Left","Mid" unf "Right"
    Gibts da evtl in C auch??

    MfG Xtreme

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.04.2005
    Ort
    Hamburg <-> Bremen
    Alter
    44
    Beiträge
    112
    Hi,
    ist das immer in der Reihenfolge ??
    Das einzige was mir spontan dazu einfaellt ist "isalpha()"(http://www.cppreference.com/stdstring/isalpha.html).
    Code:
    for(i=0; isalpha(str[i]); i++); //durchlaufen bis zur Zahl
    i=atoi(str+i);  //Zahlenstring in int convertieren
    str[i]=0x00;   //Nullerminierung
    Dann wuerde in i deine 120 als int stehen und im String str steht nur noch Dein "vor".

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    31.07.2005
    Beiträge
    54
    hi

    ich nehme an, es geht nicht nur um dieses beispiel, sondern generell um die auftrennung eines strings in befehl und daten?

    am besten definierst du dir irgend ein 'protokoll' im sinne von die ersten x bytes sind immer befehl, anschliessend kommen y bytes daten, etc

    damit kannst du recht effizient arbeiten ...

    wieviele verschiedene kommandos müssen denn übermittelt werden können? wenn es weniger als 256 sind, würde es eigentlich reichen, nur ein byte dafür zu verwenden (ok, der wert 37 ist weniger schön als 'vor', aber du musst dafür 2 bytes weniger übertragen)

    dasselbe gilt für den integer - muss der wirklich zuerst in einen string verpackt und dann wieder umgerechnet werden?

    cu

    chris

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    hallo, klappt wunderbar (isalpha). vielen dank.
    ich will damit den encoder am robby sagen z.b. das er "vor"wärts 100 encoder-werte fahren soll. komando bekommt er über funk.
    mfg pebisoft

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Wenn ich annehme, der String kommt vom Terminal, dann kriegst du den String ja Zeichenweise
    Als erstes liest du also den string einfach ein bis <CR> ( ein "\0" hängst du am besten gleich an. )
    In deinem Fall kannst du brutal die ersten 3 Byte mit "vor" vergleichen,
    if (memcmp (string, "vor", 3 ) == 0)
    und dann die Zahl
    nn = atoi((char*)&string[3]) ( die ersten 3 bytes sin ja jetzt schon weg)

    Es gibt mindestens 357 Lösungsvarianten, das ist ca Nr 37
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    die letzte lösung geht auch wunderbar.
    welche nimmt mehr speicher weg.
    ich mache 8 abfragen.
    was heissen diese warnmeldungen:
    uart.c: In function `main':
    uart.c:29: warning: passing arg 1 of `memcmp' discards qualifiers from pointer target type
    uart.c:31: warning: passing arg 1 of `usart_writeString' discards qualifiers from pointer target type
    mfg pebisoft

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Wenn du sagst
    if ( (string[0] == 'v')
    && (string[1] == 'o')
    && (string[2] == 'r')
    {
    nn = atoi(string[3])
    }

    ist das sicher eine der billigsten Varianten, nur halt nicht gut zu lesen.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    04.04.2005
    Ort
    Hamburg <-> Bremen
    Alter
    44
    Beiträge
    112
    Ja, aber auch recht speicherfressend und nicht sonderlich flexibel...
    Wenn da noch andere Befehle (auch spaeter mal zukommen sollen) wuerd ich das so nicht machen.
    Wuerde da ein schoenes Struckt empfehlen in dem der Name als String gespeicher ist und ein Pointer auf die Funktion (setzt allerdings vorraus das die alle den gleichen Uebergabeparameter haben...). Dann machst Du ein Array aus diesen Struckt (halt fuer jede Funktion eins..) und Gehts dann in der for Schleife solange durch alle durch bis Du das richtig gefunden hast. Klingt jetzt evt etwas aufwendig, aber ich wage zu behaupten das Du da deutlich weniger Speicher benoetigst als mit der Variante von PicNick.
    (Vor allem brauchst nicht so viel Tippen... Und das aendern/hinzufuegen geht auch schnell weil Du nur das Array erweitern musst).

  10. #10
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ich geb dir teilweise recht und teilweise nicht:
    Ich selbst würde das in meinem Leben nicht so machen wie ich das da hingeschrieben habe. Wie du es sagst, von wegen flexibel, modularisierung und überhaupt.

    ABER SPEICHERFRESSEND ist das nicht
    Den 3 von mir genannten Vergleichen steht beim "memcmp" und jeder allgemeinen Function eine Call-prozedur plus einer Schleifenkonstruktion für die Länge gegenüber, damit letztlich im Kern genau wieder diese 3 Byte verglichen werden.

    Außerdem muß er sich ggf. deine Vergleichstrings erstmal aus dem Flash holen, damit die function sie überhaupt lesen kann

    Also recht teuer gegen drei "if's"
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen