Pessoal, há duas semanas estou rodando com este problema e até agora não consegui ajuda.
Trabalho em um programa onde usO a função :
if ((data[0] == 'v') || (data[0] == 'V')) {
// Verifica se o primeiro caractere na string data[0] é a letra v ou V
float Ans = strtol(data+1, NULL, 10);
//Comando strtol (string para inteiro longo), para converter os caracteres depois da letra V em um inteiro.
Porem logo depois preciso trabalhar com os valores vindo da serial com números fracionários, tipo 5,66, tenho que retornar com o valor da serial O QUAL DIGITEI FRACIONÁRIO "5,66" para float novamente pois a função strtol a converteu em int.
COMO FAÇO?????????
Parte do programa:
char* parameter;
parameter = strtok (data, " ,");//o comando está sendo utilizado para dividir strings de texto em strings menores, utiliza a vírgula
while (parameter != NULL) { //Entra em um loop while com a condição de que parameter não esteja vazia, Isso diz ao comando strtok para continuar de onde tinha parado.
setLED(parameter);
parameter = strtok (NULL, " ,");
}
// Limpa o texto e os buffers seriais
for (int x=0; x<16; x++) {
buffer[x]='\0'; //preenche o array buffer com caracteres NULL, o que é feito com o símbolo \0.
}
Serial.flush();// então libera os dados do buffer serial, deixando-o pronto para a entrada do próximo conjunto de dados
}
void setLED(char* data) { //*data é o ponteiro que guardará o array do buffer que foi copiado da serial
if ((data[0] == 'v') || (data[0] == 'V')) { // Verifica se o primeiro caractere na string data[0] é a letra v ou V
float Ans = strtol(data+1, NULL, 10); //Comando strtol (string para inteiro longo), para converter os caracteres depois da letra V em um inteiro.
Ans = map (Ans,0,10,0,255);
Ans = constrain(Ans,0,255); // Comando constrain para garantir que Ans vá apenas de 0 a 255 e não passe disso
analogWrite(TensaoOut, Ans);
Serial.print("Modulo: ");
Serial.println(Ans);
Tags:
Eu não gosto de usar essas funções de busca em strings, prefiro fazer "no braço" (old school :) ). Testa a função abaixo:
/// Converte dado ascii no formato "inteiro,decimal" para float
float asciiToFloat( char *data )
{
char *slash = data;
float converted = 0;
/// valida o argumento
if ( !data )
return 0;
/// printf( "data : %s\n", data );
while ( *slash != '\0' )
{
if ( *slash == ',')
{
/// Encontrou a virgula :
/// -> Marca posicao da virgula como NTS para conversao da
/// parte inteira
/// -> Converte (e armazena) valor apos a virgula para decimal
*slash = '\0';
converted = atol(slash+1);
converted /= 100;
/// printf( "Convertendo %s para %f\n", slash+1, converted );
break;
}
slash++;
}
converted += atol( data );
/// printf( "Val : %f\n", converted );
return converted;
}
Happy hack :)
Daniel, muito obrigado,
Mas me perdoe sou muito iniciante, em que parte do programa devo acrescentar sua sugestão, rsrsrsr
Daniel acrescentei logo abaixo do comando:
if ((data[0] == 'f') || (data[0] == 'F')) {
float Ans = strtol(data+1, NULL, 10);
Serial.print("Modulo Calibracao de Corrente: ");
Serial.println(Ans);
}
if ((data[0] == 'f') || (data[0] == 'F')) {
float Ans = strtol(data+1, NULL, 10);
/////////
Apresentou erro no return 0 ; será que errei em algo?
O erro diz que você está tentando retornar um valor em uma função que retorna void. Você está colocando este código em SETUP OU LOOP ? No arduino colocamos "void loop" ou "void setup" void = nada. Ou seja, ele diz ao compilador que esta função não retorna nada. Você está tentando retornar um inteiro que é o 0 em uma função que não retorna nada. Apaga este return 0. Ele basicamente serve para o densenvolvedor descobrir onde o código pode estar dando problema, quando o programa da um "return 0" significa que ele rodou sem problemas. Este comando é dispensável, à priori, no seu caso.
Obrigado Guilherme, vou tentar depois posto o que deu....
Guilherme não funcionou, rsrsrs
Continuo digitando o valor fracionário, e na saída do Arduino sai arredondado.
ex: digito 3.5 sai 3....
float saida;
char numero[] = "3.14159";
void setup(){
saida=atof(numero);}
void loop(){
}
Obrigado Fábio, só mais uma ajudinha, onde eu acrescento este código??? rsrsrsr
Após a indexação do ponteiro?
Abraços.
Cara, o que eu te passei é uma função, você não deve colocar ela dentro de outra função... O erro que o compilador apresentou é pq você colocou um ";" após o nome da função.
Leia uns tutoriais sobre programação estruturada em C, vão te ajudar.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por