long wert wird zerschossen

hallo miteinander,

ich übergebe über den Seriellen Monitor die Zahl "123456789" und möchte die dann in einen LONG wert packen. doch dann kommt da -7616 bei raus :frowning:

Ich dachte das ich LONG werte von 2 Milliarden (- wie ins +) wert hinterlegen lassen.

Variablen sind vor dem "void setup() " deklariert!

      int Freigabe_t;
      int Richtung_t;
      long Takt_t;
      int Speed_t;
void Befehl_config( char* text )
  {
    Serial.println(text);
 
      char* str = text;

    Serial.println(str);  
    
      char* ptr = strstr(str, "F=");
        if (ptr != NULL)
          { Freigabe_t = atoi(ptr + 2); }
      ptr = strstr(str, "R=");
        if (ptr != NULL)
          { Richtung_t = atoi(ptr + 2); }
      ptr = strstr(str, "T=");
        if (ptr != NULL)
          { Takt_t = atoi(ptr + 2); }
      ptr = strstr(str, "RPM=");
        if (ptr != NULL)
          { Speed_t = atoi(ptr + 4); }

text = "config,T=123456,F=1,R=0,RPM=50"

wo habe ich denn den Denkfehler?

Gruß Mücke

Mein C Handbuch sagt:

int atoi (const char * str);

Ich würde also nicht erwarten, dass long funktioniert.

Du suchst vermutlich strtol(), oder so..

combie:
Mein C Handbuch sagt:Ich würde also nicht erwarten, dass long funktioniert.

Du suchst vermutlich strtol(), oder so..

hmm, sch** dann schaue ich mir mal strtol, ... was das auch schon wider ist, ...

atol() ist hier besser als strtol()

strtol() braucht man nur wenn man eine andere Basis als Dezimal möchte, z.B. Binär oder Hex.

Serenifly:
atol() ist hier besser als strtol()

Durchaus möglich!

Ich bin schon voll glücklich, wenn Mücke demnächst selber auf die Idee kommt, das Handbuch zu Rate zu ziehen.

Nach dem Motto:
Funktion tut nicht, das was ich will .....
Also Handbuch schauen: Was tut es überhaupt?
Dann, nach Bedarf, andere Funkion suchen, oder selber schreiben.

:sunglasses: :sunglasses:

hi,

kann mücke nicht. zuviele offene projekte... :slight_smile:

gruß stefan

Serenifly:
atol() ist hier besser als strtol()

strtol() braucht man nur wenn man eine andere Basis als Dezimal möchte, z.B. Binär oder Hex.

Ah, darum habe ich da nur Tiefbahnhof verstanden, ...

das atol ist Toll, danke das macht was es soll :-), i am Heppy :grin:

// ***********************************************************************************************
//                                   Befehl config
// ***********************************************************************************************
//  config.....   = Syntax: config,... Parameter ...
//  Parameter: sie mssen in keine bestimmten Reihenfolge erfolgen.
//              Freigabe: F=...  => 0; Stromlos   => 1; Bestromt
//              Richtung: R=...  => 0; Links      => 1; Rechts 
//              Takt:     T=...  => anzahl der Schritte
//              Speed:    RPM=.. => geschwindigkeit in rpm

// config,F=1,R=20,T=123456,RPM=50
// config,RPM=50,F=1,R=20,T=123456
// config,R=1,F=1,T=123456,RPM=50
// config,T=123456,F=1,R=0,RPM=50

void Befehl_config( char* text )
  {
      char* str = text;

      char* ptr = strstr(str, "F=");
        if (ptr != NULL)
          { Freigabe_t = atoi(ptr + 2); }
      ptr = strstr(str, "R=");
        if (ptr != NULL)
          { Richtung_t = atoi(ptr + 2); }
      ptr = strstr(str, "T=");
        if (ptr != NULL)
          { Takt_t = atol(ptr + 2); }
      ptr = strstr(str, "RPM=");
        if (ptr != NULL)
          { Speed_t = atoi(ptr + 4); }

    Serial.print(F("Frei"));               // tabelle ausgeben  
    Serial.print(F("\t"));                 // tabelle ausgeben  
    Serial.print(F("R / L"));              // tabelle ausgeben  
    Serial.print(F("\t"));                 // tabelle ausgeben  
    Serial.print(F("Takt"));               // tabelle ausgeben  
    Serial.print(F("\t"));                 // tabelle ausgeben  
    Serial.println(F("RPM"));              // tabelle ausgeben  

    Serial.print(Freigabe_t);              // Freigabe ausgeben  
    Serial.print(F("\t"));                  
    Serial.print(Richtung_t);              // Richtung ausgeben  
    Serial.print(F("\t"));
    Serial.print(Takt_t);                  // Takt ausgeben  
    Serial.print(F("\t"));
    Serial.println(Speed_t);               // Speed ausgeben  
  }

combie:
Ich bin schon voll glücklich, wenn Mücke demnächst selber auf die Idee kommt, das Handbuch zu Rate zu ziehen.

welches denn? in dem von C / C++ verstehe ich nur Bahnhof und manchmal Fliegen die Bahnhöfe dort sogar, ..

und das Andere Handbuch das ich gerade Lese ist nicht wirklich besser, ...


20150423_171634.jpg

das ist das von dem Motor denn ich anstauen möchte, bzw. ein Test Programm erstellen möchte das ich den Motor mal testen kann. Dazu komme ich aber erst Nächste Woche oder Übernächste Woche noch bin ich nur am Lesen, denn Nächste / Übernächste Woche soll der Motor kommen :slight_smile:

Eisebaer:
hi,

kann mücke nicht. zuviele offene projekte... :slight_smile:

gruß stefan

Hallo Artverwalter, :grin:

das ist kein neues Projekt nur ein Neues Topic das ich eröffnet habe gehört immer noch zum Teilprojekt CNC - Linearisierung ich habe nur nicht ein Topic pro Projekt sondern versuche die Probleme unter den Richtigen Titeln zu führen, wobei das für mich einfacher wäre alle Fragen die in einem Projekt aufkommen immer in einem Topic zu führen, ... ob da der Admin mit macht, .. :grin:

Das sind fast alles Standard Funktionen die es seit Jahrzehnten gibt. Entsprechend ist das alles sehr gut dokumentiert. Da nachzuschlagen ist doch einfacher als bei jeder Kleinigkeit hier nachzufragen

Zu Konvertierungsfunktionen:
https://www.proggen.org/doku.php?id=c:lib:stdlib:start#string-konvertierungsfunktionen

Die String Funktionen sind hier erklärt:

https://www.proggen.org/doku.php?id=c:lib:string:start#string_library

Was es wirklich auf dem AVR gibt steht hier:
http://www.nongnu.org/avr-libc/user-manual/group__avr__stdlib.html
http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html
Das ist hier und da etwas anders, aber deckt sich größtenteils mit den Standard C Funktionen

Danke, Serenifly, für die wertvollen Links. Die kommen heute Abend subito in meine Favoriten.

Vielleicht kannst Du mir auch bezüglich ein paar anderen Fragen im Ungang mit der Arduino-Umgebung ein paar Tipps/Links geben?

  • Vielleicht finde ich über die letzten Links auch heraus, was mir für variabeln genau zur Verfügung stehen. :frowning:
  • Vielleicht finde ich auch noch heraus, was es mit TIMSK0 Variabeln auf sich hat. Die "TIMSKO Oilfield Consulting" brachte mich irgendwie nicht weiter. :astonished:
  • Vielleicht finde ich auch eines Tages heraus, was der Vorteil dieser uint32_t usw. Definitionen sind. :confused:

Amarganth:
de ich über die letzten Links auch heraus, was mir für variabeln genau zur Verfügung stehen.

Meinst du Makros wie DATE oder TIME ? Das sind keine Variablen

Um das System kennen zu lernen ist am besten eine IDE mit Auto-Vervollständigung zu haben. z.B. Visual Studio Community Edition + Visual Micro. Da sieht man auch sofort was Funktionen an Parametern erwarten

Vielleicht finde ich auch noch heraus, was es mit TIMSK0 Variabeln auf sich hat

Timer0 Interrupt Mask Register. Siehe Datenblatt des Prozessors (Timer0 -> Register Description)

Da werden die Overflow oder Compare Match Interrupts aktiviert.

Vielleicht finde ich auch eines Tages heraus, was der Vorteil dieser uint32_t usw. Definitionen sind.

Weil das Plattform-unabhängig ist. Auf dem AVR ist 32 Bit der Datentyp long. Aber auf dem ARM sind schon ints 32 Bit groß

Für die C Funktionen ist noch diese Seite sehr gut:
http://www.cplusplus.com/reference/cstdlib/
http://www.cplusplus.com/reference/cstring/

@Amarganth: Wegen der Timer etc. der AVR's. Klar steht alles im Datasheet.
Wenn man nun wenig Erfahrung hat, verliert man gerne den Überblick welches Register für was zuständig ist.

Dort ist dies etwas übersichtlicher.

rudirabbit:
Dort ist dies etwas übersichtlicher.

Grundlegend ja. Um das Prinzip zu verstehen ist der Artikel sehr gut

Aber gerade für das TIMSK Register stimmt er nicht ganz. Die älteren AVRs haben ein Interrupt Masken Register für alle Timer. Auf den "neueren" hat jeder Timer ein eigenes Register dafür. Das gleiche mit dem Interrupt Flag Register (das man aber eigentlich nie selbst anfassen muss).

Das dies nicht auf alle Atmels genau passen kann ist klar, das kann nur das jeweilige Datasheet.

Favoriten aktualisiert. :smiley:
Danke euch beiden für die Hilfe.

Visual Studio läuft nur auf Windows. Und davon habe ich mich im privaten Umfeld entfernt. Ich arbeite mit Apple-Hardware. Ist da auch etwas bekannt, das die Standard-IDE von Arduino komfortabel ersetzt? Möglicherweise sogar mit einem Debugger?

Und, so nebenbei: Allen die das lesen ein schönes Wochenende. 8)