Data z logického analyzátoru je možné uložit např. v diferenciálním formátu s příponou .cvs. Data jsou uchována ve dvou sloupcích, první obsahuje čas v sekundách a druhý logickou hodnotu, která platí od času uvedeného u předešlé hodnotu po čas uvedený u aktuální hodnoty. Formát tak ukládá pouze změny signálu, nikoliv jednotlivé vzorky. Například jednotkový skok v tomto formátu zabere pouze 2 řádky dat a hlavičku (v konkrétním případě celkem 32B) bez ohledu na dobu vzorkování a vzorkovací frekvenci. Data lze dekodovat obdobným způsobem, kterým to dělá přijímač sériové linky. Dále je vhodné spočítat CRC, aby se ověřilo bezchybné přijetí a dekodování. Pro tento účel může posloužit jednoduchý skript vytvořený pro GNU Octave (opensource varianta matlabu, nemá sice k dispozici tolik knihoven a pokročilých funkcí jako MATLAB, ale je dostupný zdarma vč. zdrojových kódů).
Ve výstupu jsou k vidění dva datové rámce a spousta "synchronizačně-adresních" rámečků (ty nemají CRC)
Kód: Vybrat vše
clear;
data_in = csvread("jht100k.csv");
out_file_name = "out.txt";
bit_period = 0.1037e-3;
since = 0;
data_in_x = data_in(:,1);
data_in_y = data_in(:,2);
N = length(data_in_x);
last_val = data_in_y([1]);
j = 1;
k = 1;
l = 1;
m = 1;
state = 'ws';
for i=1:N-1
if (data_in_x([i]) >= since)
break;
endif
end
frame_time = data_in_x([i]);
for i=i:N-1
while (data_in_x([i+1]) > frame_time)
switch (state)
case 'ws'
%printf("wait for start bit\n");
if (data_in_y([i]) == 0)
frame_time = data_in_x([i]) + 1.5*bit_period;
uart_out = 0;
bit_num = 0;
state = 'fb';
else
break;
endif
case 'fb'
%printf("first bit\n");
bit_num++;
sample_time([l]) = frame_time;
sample_time_y([l++]) = 0.9;
if (data_in_y([i]) > 0)
uart_out = uart_out/2;
uart_out += 128;
else
uart_out = uart_out/2;
endif
frame_time += bit_period;
if (bit_num >=8)
state = 'br';
endif
case 'br'
%printf("%x\n", uart_out);
data_out([m++]) = uart_out;
uart_out = 0;
if (data_in_y([i]) > 0)
state = 'st';
else
sample_time([l]) = frame_time;
sample_time_y([l++]) = 0.95;
frame_time += bit_period;
state = 'fs';
endif
case 'fs'
if (data_in_y([i]) > 0)
%printf("synchronization\n");
data_out([m++]) = 512;
state = 'st';
else
state = 'fe';
endif
case 'fe'
%printf("frame error\n");
state = 'st';
case 'st'
%printf("stopbit\n");
sample_time([l]) = frame_time;
sample_time_y([l++]) = 0.97;
if (data_in_y([i]) > 0)
state = 'ws';
endif
break;
endswitch
endwhile
data_disp_x([j]) = data_in_x([i]);
data_disp_y([j]) = last_val;
j++;
data_disp_x([j]) = data_in_x([i]) + 0.0000000001;
data_disp_y([j]) = data_in_y([i]);
j++;
last_val = data_in_y([i]);
end
plot(((data_disp_x)*1000), data_disp_y, 'linewidth', 2, sample_time*1000,
sample_time_y, '+', 'linewidth', 5);
xlim([since*1000 since*1000+40]); ylim([0 4]);
function crc = jht_crc (data)
jht_crc_table=[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24,26, 28, \
30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, \
60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, \
88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, \
114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, \
136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, \
158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, \
180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, \
202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, \
224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, \
246, 248, 250, 252, 254, 25, 27, 29, 31, 17, 19, 21, 23, \
9, 11, 13, 15, 1, 3, 5, 7, 57, 59, 61, 63, 49, 51, 53, 55, \
41, 43, 45, 47, 33, 35, 37, 39, 89, 91, 93, 95, 81, 83, \
85, 87, 73, 75, 77, 79, 65, 67, 69, 71, 121, 123, 125, \
127, 113, 115, 117, 119, 105, 107, 109, 111, 97, 99, 101, \
103, 153, 155, 157, 159, 145, 147, 149, 151, 137, 139, \
141, 143, 129, 131, 133, 135, 185, 187, 189, 191, 177, \
179, 181, 183, 169, 171, 173, 175, 161, 163, 165, 167, \
217, 219, 221, 223, 209, 211, 213, 215, 201, 203, 205, \
207, 193, 195, 197, 199, 249, 251, 253, 255, 241, 243, \
245, 247, 233, 235, 237, 239, 225, 227, 229, 231 ];
N = length(data);
crc = 0;
for i=1:N
crc = jht_crc_table([uint8(crc) + 1]);
crc = bitxor(uint8(crc), uint8(data([i])));
end
endfunction
fid = fopen(out_file_name, 'w');
j = 1;
for i=1:length(data_out)
if (data_out([i]) > 255)
if ((i - 3) >= (j + 1))
crc = jht_crc(data_out([(j + 1):(i - 3)]));
else
crc = -1;
endif
fprintf(fid, "<< crc: 0x%02X\n", crc);
%printf("<< crc: 0x%02X\n", crc);
j = i;
else
fprintf(fid, "0x%02X ", data_out([i]));
%printf("0x%02X ", data_out([i]));
endif
end;
fclose(fid);