Перейти к содержанию

    

Matlab. histogram

Читаю по последовательному порту 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, и уже тогда уходить в цикл.

Любые замечания приму с интересом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поправил конец программы, чтобы выводились нулевые бины в ряд.

Z = int16.empty;

for L = 1 : HLIM
    if H.Values(L) == 0
        % disp(L);
        Z = [Z, L];
    end
end

disp(Z);

 

И в настройках Матлаба задал Numeric display: compact.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скобки круглые для индексов массивов и параметров функций, квадратные для явного задания массивов, фигурные - для cell arrays.

 

Ну про функции сложно сказать что-то. Как в любом программировании.

 

Вэйтбар есть строенный:

h = waitbar(0,'byte reseived:0/0');
for K = 1 : SLIM
    B = fread(Port, 2);
    T = bitor(bitand(B(1),63), bitsll(bitand(B(2),63),6));
    M(K) = T;
    waitbar(K / SLIM,h,['byte reseived:',num2str(K),'/',num2str(SLIM)])
end
close(h)

 

Можно сбросить все открытые устройства функцией instrreset.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо! Бар уже применил. instrreset тоже всунул в начало скрипта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация