Conversão da leitura do acelerômetro de Hex para Decimal

2

Eu tenho um arquivo hexadecimal gerado por acelerômetro com um registro de data e hora, ele tem dados de aceleração de três eixos. Os dados são assim:

C1 EB C1 F9 C1 C6

12:57:39.046:

41 F0 81 FA 41 C6

12:57:39.062:

01 F7 C1 FA 81 C6

12:57:39.078:  

Eu preciso separar isso assim:

C1EB C1F9 C1C6 

41F0 81FA 41C6 

01F7 C1FA 81C6  

Finalmente eu preciso convertê-lo para decimal em Matlab para ver a aceleração. Alguém pode me ajudar com isso?

    
por Dilip 04.04.2011 / 20:34

2 respostas

2

Se cada linha de um arquivo chamado 'measurement.txt' for semelhante a

C1 EB C1 F9 C1 C6 12:57:39.046:

uma expressão regular pode ser usada para extrair os números hexadecimais (cada um com 4 dígitos), remover os espaços e transformar o número em decimal usando MATLAB, com o seguinte código:

data = importdata('measurement.txt',' ');
data_hex = [];
for m = 1 : size(data,1)
    [start_idx, end_idx, extents, matches, tokens, names, splits] = regexp(data{m,1},'([A-F0-9]{2} [A-F0-9]{2}) ([A-F0-9]{2} [A-F0-9]{2}) ([A-F0-9]{2} [A-F0-9]{2}).*');

    for n = 1 : size(tokens{1,1},2)
        data_hex{m,n} = strrep(tokens{1,1}(1,n),' ','');
        data_dec(m,n) = hex2dec(data_hex{m,n});
    end
end
    
por 04.04.2011 / 20:44
0

Assumindo este formato lógico para coleta de dados:

12:57:18.281: C1 F3 81 F6 81 C5
12:57:18.296: 01 F0 41 F7 01 C6
12:57:18.296: 41 ED C1 F7 01 C6
12:57:18.312: C1 E8 01 F8 01 C6

Este programa perl:

#!/usr/bin/perl
$time=0;$data='';
while(<>){
  if(s/^(\d+):(\d+):(\d+)\.(\d+):\s*//) {
    $time=3600*$1+60*$2+$3+$4/1000;
  }
  if(s/(..)\s+(..)\s*/(hex($1)<<8|hex($2))."\t"/eg) {
    s/\t$//;
    $data=$_;
  }
  print "$time\t$data\n";
}

Com esta linha de comando:

perl accelerometer-parse.pl < data.in > data.out

O converterá em um formato separado por guia universal com o qual qualquer coisa funcionará:

46638.281       49651   33270   33221
46638.296       496     16887   454
46638.296       16877   49655   454
46638.312       49640   504     454

Para fazer qualquer sentido significativo dos dados, você precisará do eixo do tempo também. Para começar de t = 0, basta subtrair a primeira entrada de tempo de todos os pontos de dados subseqüentes.

    
por 24.07.2011 / 01:32

Tags