Boa noite andei pesquisando e vi que é possivel transformar uma char em um valor inteiro com o comando atoi()..... eu coloquei em um porgrama onde eu possuo um shield SMS, que nesse caso eu iria enviar uma msg com o valor 20 (minha variavel C) e eu queria transformar esse valor em numero int para que eu possa somar ou diminuir valor.... Mas esta dando um erro e eu nao sei que esta dando de errado.....
Abaixo a programaçao e o erro que esta ocorrendo
//SMS receiver
// libraries
#include <GSM.h>
char c;
float resul = atoi(c);
float desconto;
float resul_desconto;
// PIN Number
#define PINNUMBER ""
// initialize the library instance
GSM gsmAccess; // include a 'true' parameter for debug enabled
GSM_SMS sms;
char remoteNumber[20]; // Holds the emitting number
void setup()
{
// initialize serial communications
Serial.begin(9600);
Serial.println("SMS Concessiornaria");
// connection state
boolean notConnected = true;
// Start GSM shield
// If your SIM has PIN, pass it as a parameter of begin() in quotes
while(notConnected)
{
if(gsmAccess.begin(PINNUMBER)==GSM_READY)
notConnected = false;
else
{
Serial.println("Não Conectado");
delay(1000);
}
}
Serial.println("GSM Inicializado");
//Serial.println("Waiting for messages");
}
void loop()
{
char c;
// If there are any SMSs available()
if (sms.available())
{
Serial.println("Mensagem Recebida");
// Get remote number
sms.remoteNumber(remoteNumber, 20);
Serial.println(remoteNumber);
// This is just an example of message disposal
// Messages starting with # should be discarded
if(sms.peek()=='#')
{
//Serial.println("Discarded SMS");
sms.flush();
}
// Read message bytes and print them
Serial.println("Voce Recarregou (R$):");
while(c=sms.read())
Serial.print(c);
//Serial.println("\nEND OF MESSAGE");
// delete message from modem memory
sms.flush();
//Serial.println("MESSAGE DELETED");
// Desconto do valor da msg
desconto = (resul-5);
resul_desconto = resul_desconto + desconto;
Serial.print("Valor recebido com 5 reais descontado: ");
Serial.println(desconto,10);
Serial.print("Valor acumulado: ");
Serial.println(resul_desconto,10);
}
delay(1000);
}
ERRO::
sms.ino:7:23: error: invalid conversion from 'char' to 'const char*' [-fpermissive]
In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:23:0,
from C:\Program Files (x86)\Arduino\libraries\GSM\src/GSM3MobileCellManagement.h:37,
from C:\Program Files (x86)\Arduino\libraries\GSM\src/GSM.h:41,
from sms.ino:5:
c:\program files (x86)\arduino\hardware\tools\avr\avr\include\stdlib.h:274:12: error: initializing argument 1 of 'int atoi(const char*)' [-fpermissive]
extern int atoi(const char *__s) __ATTR_PURE__;
^
Erro compilando.
Tags:
vc fez errado no sketch. Ali no início, onde vc faz a conversão usando atoi, aquela linha não é pra ficar ali no começo.
A conversão deve ser feita após haver algum dado na variável "c", ou seja, a conversão usando atoi deverá ser feita somente após o torpedo sms chegar
Veja esse exemplo funcionando, pois eu fiz a conversão usando atoi depois de existir dado em "a":
void setup() {
Serial.begin(9600);
char a[] = "3";
int b = atoi(a);
int c = 2;
c = c+b;
Serial.print(c);
}void loop() {}
Agora veja esse exemplo não funcionando (dá erro de compilação), pois a conversão usando atoi é feita antes de haver dado em "a", ou seja, exatamente da mesma maneira como vc está tentando fazer:
void setup() {
Serial.begin(9600);
char a;
int b = atoi(a);char a[] = "3";
int c = 2;
c = c+b;
Serial.print(c);
}void loop() {}
Beleza amigo obrigado pela ajuda e desculpa por alguma coisa
Ola, realizei a montagem como vc disse, mas continua dando o mesmo erro... nao precisa add nenhuma biblioteca junto ?
Eu modifiquei o paramento pra transformar a char c, em inteiro da seguinte forma:
char c;
if (sms.available())
{
Serial.println("Mensagem Recebida");
sms.remoteNumber(remoteNumber, 20);
Serial.println(remoteNumber);
if(sms.peek()=='#')
{
//Serial.println("Discarded SMS");
sms.flush();
}
Serial.println("Voce Recarregou (R$):");
while(c=sms.read())
Serial.print(c);
// Desconto do valor da msg
int resul = int (c);
desconto = (resul-5);
resul_desconto = resul_desconto + desconto;
Serial.print("Valor recebido com 5 reais descontado: ");
Serial.println(desconto,10);
Serial.print("Valor acumulado: ");
Serial.println(resul_desconto,10);
Mas dai eu simulando da nisso
GSM Inicializado
Mensagem Recebida
+55xxxxxxx
Voce Recarregou (R$):
20Valor recebido com 5 reais descontado: -5.0000000000
Valor acumulado: -5.0000000000
So que o que eu queria... no caso eu joguei 20 na msg, entao meus 20 é a char, eu queria transformar em valor inteiro, nesse caso o Valor recebido com 5 reais descontado teria que ser 15..
E o valor acumulado, é soma do restante + uma msg futura
Desde jah agradeço, mas nao consegui utilizar o atoi(), ele nao esta compilando, se possivel fazer um teste para ver se compila pelo menos
Agradecido
faça 3 testes e diga qual foi o resultado:
teste 1: envie um torpedo contendo a mensagem 9, ao invés de 20. Diga qual seria o valor esperado e qual foi o resultado
teste 2: envie um torpedo contendo a mensagem 19. Diga qual seria o valor esperado e qual foi o resultado
teste 3: envie um torpedo contendo a mensagem 15. Diga qual seria o valor esperado e qual foi o resultado
O teste realizado gerou o seguinte resultado:
SMS Concessiornaria
GSM Inicializado
Mensagem Recebida
+55xxxxx
Voce Recarregou (R$):
9Valor recebido com 5 reais descontado: -5.0000000000
Valor acumulado: -5.0000000000
Mensagem Recebida
+55xxxxxxx
Voce Recarregou (R$):
19Valor recebido com 5 reais descontado: -5.0000000000
Valor acumulado: -10.0000000000
Mensagem Recebida
+55xxxxxx
Voce Recarregou (R$):
15Valor recebido com 5 reais descontado: -5.0000000000
Valor acumulado: -15.0000000000
----------------------------------------- Esperado
1)Mandando 9 na msg
Valor recebido com 5 reais descontado: 4
Valor acumulado: 4
2)Mandando 19 na msg
Valor recebido com 5 reais descontado: 14
Valor acumulado: 18 (4+14)
3)Mandando 15 na msg
Valor recebido com 5 reais descontado: 10
Valor acumulado: 28 (4+14+10)
Os resultado obtidos foi com o seguinte comando
int resul = int (c);
desconto = (resul-5);
resul_desconto = resul_desconto + desconto;
Para ativar o comando atoi(), nao é necessario add uma biblioteca no inicio??
aqui comigo não precisou de biblioteca nenhuma pra usar o atoi. Bastou eu enviar aquele sketch que te mostrei pro arduino que funcionou normal.
Esse sketch a seguir eu envio exatamente desse jeito pro arduino:
void setup() {
Serial.begin(9600);
char a[] = "3";
int b = atoi(a);
int c = 2;
c = c+b;
Serial.print(c);
}void loop() {}
só de curiosidade, qual IDE vc está usando? Esse sketch teste aí que estou te colando deu erro de compilação contigo?
Em relação aos 3 testes, é um indício claro de que nenhuma mensagem de torpedo sms está sendo usada no cálculo que vc aplicou.
Aqui tb compilou e deu certo essa que tu me mandou, funcionou....
Pse, pelos resultados parece que o valor da msg nao esta sendo transformado em valor inteiro, por isso nao consigo diminui com o 5 no caso....
O estranho é que eu colocando meu programa da seguinte forma:
void loop()
{
char c;
// If there are any SMSs available()
if (sms.available())
{
Serial.println("Mensagem Recebida");
sms.remoteNumber(remoteNumber, 20);
Serial.println(remoteNumber);
if(sms.peek()=='#')
{
sms.flush();
}
Serial.println("Voce Recarregou (R$):");
while(c=sms.read())
Serial.print(c);
sms.flush();
// Desconto do valor da msg
int resul = atoi (c);
desconto = (resul-5);
resul_desconto = resul_desconto + desconto;
Serial.print("Valor recebido com 5 reais descontado: ");
Serial.println(desconto,10);
Serial.print("Valor acumulado: ");
Serial.println(resul_desconto,10);
}
Ele me da o seguinte erro
sms.ino:7:23: error: invalid conversion from 'char' to 'const char*' [-fpermissive]
In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:23:0,
from C:\Program Files (x86)\Arduino\libraries\GSM\src/GSM3MobileCellManagement.h:37,
from C:\Program Files (x86)\Arduino\libraries\GSM\src/GSM.h:41,
from sms.ino:5:
c:\program files (x86)\arduino\hardware\tools\avr\avr\include\stdlib.h:274:12: error: initializing argument 1 of 'int atoi(const char*)' [-fpermissive]
extern int atoi(const char *__s) __ATTR_PURE__;
^
Erro compilando.
Naquele programa de cima eu n usei atoi, usei uma outra forma mas n deu certo
vamos fazer uma nova tentativa.
inclua no início do sketch, antes do void setup(), a seguinte linha:
String TextoAcumulado = "";
Procure no seu código o trecho a seguir:
Serial.println("Voce Recarregou (R$):");
while(c=sms.read())
Serial.print(c);sms.flush();
E substitua por isso:
Serial.println("Voce Recarregou (R$):");
while(c=sms.read()){
Serial.print(c);TextoAcumulado += c;
delay(10);
}
sms.flush();
E por fim, localize o trecho abaixo dentro do seu código:
// Desconto do valor da msg
int resul = atoi (c);
desconto = (resul-5);
resul_desconto = resul_desconto + desconto;
Serial.print("Valor recebido com 5 reais descontado: ");
E substitua pra ficar assim:
// Desconto do valor da msg
int resul = TextoAcumulado.toInt();
desconto = (resul-5);
resul_desconto = resul_desconto + desconto;
Serial.print("Valor recebido com 5 reais descontado: ");
Basicamente, o que estamos fazendo com essas modificações é pegar a mensagem sms caracter por caracter e acumular dentro de uma string. Depois essa string nós transformaremos em número inteiro para então ser usado nas operações matemáticas.
É mais ou menos a mesma coisa que esse sketch a seguir fará (aqui só não tem a conversão de char em string):
void setup() {
Serial.begin(9600);
int a;
String b = "";b = "30";
a = b.toInt();
a = a + 3;
Serial.print(a);
}
void loop() {}
Olá Darlan,
Teste substituindo o trecho:
while(c=sms.read())
Serial.print(c);
// Desconto do valor da msg
int resul = int (c);
Pelo:
char stringValor[20];
int stringValorIndex = 0;
while(c=sms.read()) stringValor[stringValorIndex++] = c;
stringValor[stringValorIndex++] = 0;
Serial.print(stringValor);
// Desconto do valor da msg
int resul = atoi(stringValor);
</code>
Boa sorte e grande abraço,
'Eiju
Obrigado Eiju.. pode deixar que vou testar e te aviso ... Abraço
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por