Olá a todos, encontrei um código na net que é o que necessito porém sou iniciante nessa área e não estou conseguindo alterar para ampliar o código.

O código é para ler arquivos CSV em um cartão de memória e separar os valores que estão separados entre as virgulas e coloca-los em variáveis separadas.

Esse código foi escrito para ler e separar o primeiro campo e o segundo campo entre as virgulas criando uma variável com os dados do primeiro campo sendo X e o segundo campo como Y

O que esta dentro do cartão se parece com isso:

-5
-5
-5

230, -1, -1, -1, -1,
242, -1, -1, -1, -1,
254, -1, -1, -1, -1,
-5
-5
-5
-5
-1, -1, 0, -1, -1,
-1, -1, 63, -1, -1,
-1, -1, 127, -1, -1,
-1, -1, 190, -1, -1,
-1, -1, 254, -1, -1,
-5
-5
-5

O que eu pretendo alterar no código é para ler e criar mais variáveis em vez de só 2 e não estou conseguindo.

Tentei essas alterações mas não obtive exito.

//bool readVals(long* v1, long* v2) {
bool readVals(long* v1, long* v2, long* v3, long* v4) {

*******************************************************************

// long x, y;

long x, y, w, z;

*******************************************************************

while (readVals(&x, &y, &w, &z)) {
Serial.print("x: ");
Serial.println(x);
Serial.print("y: ");
Serial.println(y);
Serial.print("w: ");
Serial.println(w);
Serial.print("z: ");
Serial.println(z);
Serial.println();
}

*******************************************************************

Se alguém com mais experiencia puder ajudar ficarei muito grato.

 

Exibições: 440

Anexos

Responder esta

Respostas a este tópico

Olá.

  Para poder responder é preciso ter seu codigo todo, em especial a função readVals();

  Coloque ele como anexo ou outra forma, senão fica impossível.

  Dei um google aqui e achei essa, a titulo de curiosidade, ela é algo meio complexo pra chutar sem ver. Sequer sei se é a sua:

bool readVals(double* v1, double* v2, double* v3 , double* v4) {
  char line[40], *ptr, *str;
  if (!readLine(file, line, sizeof(line))) {
    return false;  // EOF or too long
  }
  *v1 = strtod(line, &ptr);
  if (ptr == line) return false;  // bad number if equal
  while (*ptr) {
    if (*ptr++ == ',') break;
  }
  *v2 = strtod(ptr, &str);
    while (*ptr) {
    if (*ptr++ == ',') break;
    }
  *v3 = strtod(ptr, &str);
    while (*ptr) {
    if (*ptr++ == ',') break;
    }
  *v4 = strtod(ptr, &str);
    while (*ptr) {
    if (*ptr++ == ',') break;
    }
     return str != ptr;
}

Olá Eduardo, muito obrigado pelo retorno.

Eu coloquei sim o código original, está em anexo como CSV_SD.txt ( Não está mostrando o anexo?).

Vou colocar o .ino também.

O código que você postou não é o que tenho não.

Opa, eu que não vi.

A principio acho que vc fez certo, mas a rotina é a mesma para ler 1 ou 5 numeros. Isso faz com que ela trave nas linhas que tem apenas 1 coluna e não tenha o ',' final.

Tente mudar o arquivo para:

-5,  <- a linha precisa terminar em ","
-5,
-5,

230, -1, -1, -1, -1, 
242, -1, -1, -1, -1, 
254, -1, -1, -1, -1, 
-5,
-5,
-5,
-5,
-1, -1, 0, -1, -1, 
-1, -1, 63, -1, -1, 
-1, -1, 127, -1, -1, 
-1, -1, 190, -1, -1, 
-1, -1, 254, -1, -1, 
-5,
-5,
-5,

Para testar.

A segunda opção (melhor) seria vc aceitar o numero se vier um \n ou um zero.

Veja que o while(*ptr) equivale a executar enquanto o conteudo não for 0 ou ',' mas ele não testa o fim de linha '\n'. Vc precisa adicionar essa opção. Fica o desafio..

A terceira opção (media) seria vc acionar a força na sua linha essa virgula faltante.

Algo como em readLine:

Onde esta

line[n] = 0;

Colocar 

line[n] = ',';

line[n+1] = 0;

Meio porco... mas deve funcionar.

Boa noite RAO,

normalmente por minha convicções, recuso ajudar aqueles que não me ajudam.

A ajuda que peço é simples.

Peço para os amigos não colarem sketchs na área de texto do tópico, para que o mesmo fique mais sucinto

e fácil de ler e entender  e poder ajudar.

Estou escrevendo um sketch para te ajudar, mas faltam informações para que eu realize esta ajuda.

Este seu arquivo que vai ser lido de um SD card (cartão de memoria), tem várias linhas. Certo?

Como esta linhas foram gravadas neles? Qual software. Qual a extensão do arquivo no SD card?

Vc saberia dizer os caracteres de fim de cada linha ?  Pode ser 0x0D e 0x0A ou somente 0x0A.

RV

Olá RV boa noite.

Peço desculpas pelo extenso testo anterior, acabou sendo necessário.

Respondendo suas perguntas:

01 = Sim são varias linhas, não existe um limite exato. 

02 = O software é antigo e não comercial, não tem nome foi criado em visual basic especialmente para a empresa porem o fabricante do software e hardware encerrou suas atividades tornando o sistema obsoleto a alguns anos.

O sistema é para programação de shows com servomotores por linha de tempo.

Meu pedido de ajuda não vai fazer a coisa toda funcionar mas vai me deixar dar mais alguns paços.

03 = O software exporta um arquivo .csv ( estou anexando um arquivo de teste com o 1º canal programado e o 3º programado )

Não sei te responder a ultima pergunta mas acho que o arquivo enviado pode te responder.

Obrigado.

teste%206.csv

olá Ricardo.

      Recentemente preparei para um amigo, um Sistema muito semelhante a este que vc está usando, e apenas adaptei aquela implementação para igualar as necessidades que vc relatou precisar.

      Segue a Implementação:   converter_CSV_02.zip

      Sobre esta implementação, leia o "header" descritivo da mesma, especificamente sobre o motivo pelo qual utilizei o Vetor "Valor [Max_Var]". Este "header" também mostro na figura a seguir:

(clique na figura para "zoom")

      O mecanismo foi testado e funcionou com o padrão CSV que vc está utilizando.

      Espero ter ajudado.

      Abrçs,

      Elcids

ah sim, quase me esqueço:

      Observe que deixei setado no código (logo no início, na constante "Max_Var"), para um máximo de 4 valores por linha.

      Se vc usar o Arquivo CSV que vc forneceu como exemplo (o "teste 6.csv"), lembre-se de alterar a constante "Max_Var" para 5  ou mais, pois seu Arquivo CSV tem 5 valores por linha.

      Ou seja: o valor de "Max_Var", não deve ser menor que o máximo de valores por linha do Arquivo processado ("Max_Var" pode ser maior ou igual, mas nunca menor). Isto porque a lógica processa por linha, no máximo o valor definido em "Max_Var".

      Caso exista em uma linha menos valores que o definido em "Max_Var", o Sistema trata isso automaticamente. Ou seja: em um mesmo Arquivo podem existir linhas com quantidades diferentes de valores. Mas a quantidade máxima de valores em uma linha não pode ser maior que "Max_Var".

 

      Abrçs,

      Elcids

Olá Elcids boa tarde.

Muito obrigado, seu código vai de encontro ao que necessito de momento.

Estou trabalhando nele e logo mais posto as alterações que fiz de momento.

Mais uma vez muito obrigado.

Olá Elcids muito obrigado.

No momento estou fora de casa, mas assim que chegar eu vejo.

Muito obrigado.

Olá RV.

Primeiramente me desculpe mas não estou conseguindo editar o texto para poder remover.

Realmente está diferente pois era só um exemplo.

A ideia é receber os dados e separá-los em variáveis, nesse exemplo serão 5 variáveis onde cada linha daria um novo valor a cada variável caso o mesmo o tenha sido alterado e quando tenho o valor -1 a variável continua com o ultimo valor recebido.

Os valores vão de 0 a 254 que correspondem a posição do servo motor.

O problema das virgulas acho que for porque exportei como txt e o espaço vazio foi no momento da edição para diminuir o tamanho mas não existe esse espaço.

Estou fora de casa no momento mas assim que retornar dou uma olhada.

Muito obrigado.

Bom dia RAO,

conforme prometi (apesar de você não ter removido os códigos das áreas de texto do tópico),

segue o código que elaborarei.

Antes porem tenho alguns Comentários.

1.  O formato dos dados que você colou no inicio do seu tópico estão diferentes do formato

      daqueles que  enviou no arquivo teste%206.csv.

      No do inicio do tópico as primeiras linhas não tem virgulas após os números.

     e tem uma linha vazia ente 0 -5  e  230, -1, -1, -1, -1,   .

2. Você não informou como quer receber os dados lidos e analisados.

    Eu estou os enviando para o Serial monitor.

Estou anexando uma ZIP com os seguintes aquivos:

  1 Pasta  SD_Card     contém o código .ino;

  2 Dados.txt     arquivo com os dados que você postou no inicio do tópico;

  3 teste.csv     arquivo postado por você;

  4. HEX_Dados.txt     arquivo com o formato HEX de Dados.txt;

  5. HEX_Teste.txt      arquivo com o formato HEX de teste.csv;

  6.  Serial1.txt     resultado impresso no serial monitor para dados lidos e processados do arquivo Dados.txt;

  7.  Serial2.txt     resultado impresso no serial monitor para dados lidos e processados do arquivo teste.csv;

Depois conta pra gente o resultado ai com vc.

RV

Arquivo Dados.zip

PS: Consegui carregar de outra forma.

RV

Olá RV, boa tarde.

Muito obrigado pelo trabalho e atenção prestados.

Estou trabalhando em cima do código do Elcids pois ele vai mais de encontro ao que necessito.

Mas agradeço muitíssimo a grande ajuda prestada pois sei que isso toma um grande tempo precioso.

Ao mesmo tempo peço desculpas por algum inconveniente como grandes textos.

Muito obrigado. 

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço