Tranformar variable String a long

Buenas Hace rato estoy tratando de resolver un problema. y es que no logro pasar un valor string de números a una variable long.

Con este codigo lo paso a int.

num = Serial.readString().toInt();

Pero me hace falta pasarlo a long.

por supuesto que intente.

num = Serial.readString().toLong();

Pero no funciono, si alguien me ayuda con esto se lo agradecere.

Hola.

Prueba la funcion atol() de la libreria estandar de C++

#include <stdlib.h>  // Por si acaso
long num = atol( const char *string );

Aqui tienes mas informacion: <atol()>, libreria estandar

Saludos.

La función se llama toInt, e "int" es la abreviatura de "integer" (número entero); no necesariamente tiene que significar que retorna dicho tipo de dato. Se llama toInt, pero en realidad retorna long; creo que deberías leer la documentación.

Coincido en que no leí la documentación.

Pero esa función que estoy usando actualmente retorna un Int y no un long como dices ya que los datos que puede almacenar van desde -32.768 a 32.767.

yo necesito pasar esa cadena a long para tener un rango de datos de -922337203685477508 a 922337203685477507.

Hasta ahora no logro conseguirlo.

Gracias por tu respuesta.

Lee esto y dime si retorna long o no.

scrngs:
yo necesito pasar esa cadena a long para tener un rango de datos de -922337203685477508 a 922337203685477507.

No sé de qué lenguaje de programación vienes, pero a menos de que el microcontrolador sea un ARM, el rango de long es de -2147483648 a 2147483647.

Esperas que sean de 64 bits, pero en AVR son de máximo 32 bits.

Lucario tiene razon ,esto funciona:

void setup(){
  Serial.begin(9600); 
}
void loop(){
  if (Serial.available()){
    long num = Serial.readString().toInt(); 
    Serial.println(num);
    Serial.println(sizeof(num));
  }  
}

Sin embargo el rango que quieres solo se puede conseguir con un numero de 64 bits si no he hecho mal las cuentas ,que tambien puede ser....quiza lo de arriba tambien podria valer substituyendo

long num

por

long long num

o

int64_t num

pero Serial.println no puede imprimir numeros de 64 bit y no puedo comprobarlo,aunque si funciona sizeof y devuelve 8 ,por lo tanto ,el numero es de 64bit.

Podrá existir un tipo de dato de 64 bits para AVR, pero hay dos problemas:

String.toInt() se limita a retornar long:

long String::toInt(void) const
{
 if (buffer) return atol(buffer);
 return 0;
}

Cuando intento imprimir un long long o sus equivalentes, esto sucede:

C:\Users\Usuario\AppData\Local\Temp\arduino_28a60e125e356fac4f461c5616e093c7\sketch_mar01a.ino: In function 'void setup()':

sketch_mar01a:4: error: call of overloaded 'println(long long int&)' is ambiguous

   Serial.println(l);

                   ^

C:\Users\Usuario\AppData\Local\Temp\arduino_28a60e125e356fac4f461c5616e093c7\sketch_mar01a.ino:4:19: note: candidates are:

In file included from C:\Users\Usuario\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.13\cores\arduino/Stream.h:26:0,

                 from C:\Users\Usuario\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.13\cores\arduino/HardwareSerial.h:29,

                 from C:\Users\Usuario\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.13\cores\arduino/Arduino.h:224,

                 from sketch\sketch_mar01a.ino.cpp:1:

C:\Users\Usuario\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.13\cores\arduino/Print.h:70:12: note: size_t Print::println(const __FlashStringHelper*) <near match>

     size_t println(const __FlashStringHelper *);

            ^

C:\Users\Usuario\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.13\cores\arduino/Print.h:70:12: note:   no known conversion for argument 1 from 'long long int' to 'const __FlashStringHelper*'

C:\Users\Usuario\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.13\cores\arduino/Print.h:71:12: note: size_t Print::println(const String&) <near match>

     size_t println(const String &s);

            ^

C:\Users\Usuario\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.13\cores\arduino/Print.h:71:12: note:   no known conversion for argument 1 from 'long long int' to 'const String&'

C:\Users\Usuario\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.13\cores\arduino/Print.h:72:12: note: size_t Print::println(const char*) <near match>

     size_t println(const char[]);

            ^

C:\Users\Usuario\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.13\cores\arduino/Print.h:72:12: note:   no known conversion for argument 1 from 'long long int' to 'const char*'

C:\Users\Usuario\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.13\cores\arduino/Print.h:73:12: note: size_t Print::println(char)

     size_t println(char);

            ^

C:\Users\Usuario\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.13\cores\arduino/Print.h:74:12: note: size_t Print::println(unsigned char, int)

     size_t println(unsigned char, int = DEC);

            ^

C:\Users\Usuario\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.13\cores\arduino/Print.h:75:12: note: size_t Print::println(int, int)

     size_t println(int, int = DEC);

            ^

C:\Users\Usuario\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.13\cores\arduino/Print.h:76:12: note: size_t Print::println(unsigned int, int)

     size_t println(unsigned int, int = DEC);

            ^

C:\Users\Usuario\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.13\cores\arduino/Print.h:77:12: note: size_t Print::println(long int, int)

     size_t println(long, int = DEC);

            ^

C:\Users\Usuario\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.13\cores\arduino/Print.h:78:12: note: size_t Print::println(long unsigned int, int)

     size_t println(unsigned long, int = DEC);

            ^

C:\Users\Usuario\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.13\cores\arduino/Print.h:79:12: note: size_t Print::println(double, int)

     size_t println(double, int = 2);

            ^

exit status 1
call of overloaded 'println(long long int&)' is ambiguous

En resumen: Print no posee implementación para long long.

A no ser que estés dispuesto a modificar los archivos fuente, mejor limítate al rango que ofrecen 32 bits.