реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Matlab. histogram, несколько вопросов
ViKo
сообщение Nov 27 2017, 20:43
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Читаю по последовательному порту 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, и уже тогда уходить в цикл.
Любые замечания приму с интересом.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 28 2017, 09:31
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



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

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

disp(Z);


И в настройках Матлаба задал Numeric display: compact.
Go to the top of the page
 
+Quote Post
Swup
сообщение Nov 28 2017, 10:57
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 127
Регистрация: 2-09-11
Из: Москва
Пользователь №: 66 970



Скобки круглые для индексов массивов и параметров функций, квадратные для явного задания массивов, фигурные - для 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.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 28 2017, 11:10
Сообщение #4


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Спасибо! Бар уже применил. instrreset тоже всунул в начало скрипта.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th April 2024 - 16:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01373 секунд с 7
ELECTRONIX ©2004-2016