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);

Exibições: 1567

Responder esta

Respostas a este tópico

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.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço