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

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 тоже всунул в начало скрипта.

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...