Problem mit atol (Schrittmotorsteuerung)

Gast #1321466
Ich verwende ein ATMEGA32 für die ansteuerung einiger Schrittmotoren...
Hier ist es natürlich zweckmäßig... für größere Verfahrwege die aktuelle 
Position sowie die "Fahraufträge" mit dem Typ LONG zu speichern...
Bei der konvertierung der über die UART Schnittstelle reinkommenden 
Zahlen gibt es allerdings probleme:

anscheinend funktioniert die "atol" funktion nicht richtig. mit "atoi" 
wie im Beispiel angegeben funktioniert alles (natürlich nur bis die 
Anzahl der schritte größer als der int wird)... sobald ich das mit 
"atol" ersetze wird xdestination immer =0... für größere Zahlen ergibt 
sich allerdings ein wert: z.B. eingabe:1000000 -> xdestination=15...

hat jemand eine Idee??
Vielen Dank im Voraus
Christian

P.S.: Sorry für den grausamen code :-D

Code:
<-schnipp

unsigned char in_data[110];
unsigned char out_data[110];
int verbose;
long  x_actual=0;
long  x_destination=0;
long  temp_long;


  if (strncmp(in_data,"xsteptorel=",11) == 0)
  {
//    x_destination = x_actual + (2 * atoi((&in_data[11])));
     x_destination = x_actual + (2 * atol((&in_data[11])));
      if (verbose == 1)
    {
      temp_long = atol((&in_data[11]));
      UARTWrite("Fahre jetzt ");
      sprintf(out_data, "%d", temp_long);
      UARTWrite(out_data);
        UARTWrite(" Schritte!!!\n\r");
    }

<-schnapp
Gast #1321473
- atoi und atol sind tot, strtoXXX sind aktuell
- 'long' ist in diesem Fall ungünstig, guck lieber mal nach <stdint.h>
- in <inttypes.h> stehen auch Formate für 'sprintf' und Konsorten drin
- welches System benutzt denn \n\r als Zeilentrenner...? grins
Gast #1323999
hmmm mit strtol hatte ich es auch schon versucht...

also folgende Zeile:
<-schnipp

    x_destination = x_actual + (2 * strtol (&in_data[11],NULL,10));

<- schnapp

war dann an stelle der atol funktion verwendet...
zeigt aber das gleiche Verhalten :-(...
-> das Ergebnis: 0

das long ersetze ich dann mal durch ein int32_t. Sollte aber keine 
verbesserung der Problems bringen oder?

sprintf bringt mir doch nur was für den "Rückweg", oder?... also das 
umwandeln des int in ein chararray... (das funktioniert ja auch schon so 
wies im code ist).

ups... ist \r\n nicht aktuell? Was macht man denn sonst? Sorry hab lange 
nichts mehr programmiert... Hier geht es übrigens um einen ATMEL32, der 
eine Schrittmotorsteuerung ansteuert... Gesetzt werden dir Werte über 
einen Windowsrechner mit LabView :-X...

Grüße
Christian
#1324012
... und die falsche Formatierung des Quelltextes; es geht nicht mit 
schnipp und schnapp sondern mit [-c-] am Anfang und [-/-c-] am Ende 
(ohne die Bindestriche.)

Dann sieht der Quelltext schon mal so aus, daß man sich nicht dafür 
entschuldigen muß.
Gast #1324056
jaaaa genau das wars...
verwende jetzt %ld und alles ist in Butter...
Hab den Fehler völlig woanders gesucht und erwartet...
Vielen Dank und macht weiter so :-)...

grüße
Christian

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.