Читаю по последовательному порту 12-битовые данные. Передаю слово двумя байтами - в первом биты данных D5 - D0 и 00 в старших битах, во втором биты данных D11 - D6, сдвинутые в область младших битов и 01 в старших битах. При приеме складываю в одно слово обратно. Дальше рисую гистограмму. Ищу пропуски кодов. Накапливать приходится долго, несколько минут. Что сотворил, как сумел, показываю.
Код
clear; clf; clc;
Port = serial('COM1', 'BaudRate', 115200, 'DataBits', 8, ...
'Parity', 'none', 'StopBits', 1, 'Terminator', 'LF',...
'TimeOut', 4, 'InputBufferSize', 2, 'BytesAvailableFcnMode', 'byte', ...
'BytesAvailableFcnCount', 2);
fopen(Port);
SPOW = 12;
SLIM = 2 ^ SPOW;
HLIM = 512;
M = 1 : SLIM;
H = zeros(1, HLIM + 1);
hold on; grid on; axis on;
for K = 1 : SLIM
B = fread(Port, 2);
T = bitor(bitand(B(1),63), bitsll(bitand(B(2),63),6));
M(K) = T;
end
H = histogram(M,HLIM);
for L = 1 : HLIM
if H.Values(L) == 0
disp(L);
end
end
fclose(Port); delete(Port); clear Port;
Что не нравится. Никак не привыкну к Matlab интерфейсу, не пойму, когда какие скобки использовать. И функции. Может, есть способы сделать проще и красивее?
Ожидать результатов, не наблюдая прогресса, надоедает. Что бы такого написать-нарисовать, чтобы было видно, сколько передач прошло, сколько осталось?
Или на лету рисовать гистограмму - слишком сложно? Слова прилетают с интервалом 1 мс.
Пропущенные коды выдаются в конце работы по одному в строке, да еще через строку. Что-то было, выдавать компактнее? Как бы сделать, чтобы в ряду было штук 8 значений?
Если выйти, не закрыв порт (что в конце написано), и запустить по-новой, то вылетает по ошибке. И тогда снова уже не запустишь. Порт не закрыть. Приходится закрывать Matlab и снова запускать. Есть способ умнее?
Да, синхронизации байтов нет никакой. Пока везет, что байты в слове идут подряд. Можно в начале цикла дождаться байта 01, и уже тогда уходить в цикл.
Любые замечания приму с интересом.