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.

Exibições: 826

Responder esta

Respostas a este tópico

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() {}


Outra dica que eu poderia te dar é que quando vc estiver para desenvolver uma nova implementação no seu projeto, faça em separado até entender direito como funciona. Depois que vc fizer todos os testes, aí sim vc junta ao corpo do projeto.

Por exemplo esse lance de converter char em inteiro, vc poderia fazer separado num sketch do jeito que eu te mostrei. Facilita pra vc, porque vc fica concentrado em resolver/entender essa implementação apenas e facilita na hora de pedir socorro, pois quem for te ajudar não precisa ficar lendo um monte de códigos irrelevantes para a dúvida em questão (isto é, códigos de recebimento de sms são irrelevantes para a dúvida de conversão de char em inteiro).

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 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço