ViKo 1 27 ноября, 2017 Опубликовано 27 ноября, 2017 · Жалоба Читаю по последовательному порту 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, и уже тогда уходить в цикл. Любые замечания приму с интересом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 28 ноября, 2017 Опубликовано 28 ноября, 2017 · Жалоба Поправил конец программы, чтобы выводились нулевые бины в ряд. Z = int16.empty; for L = 1 : HLIM if H.Values(L) == 0 % disp(L); Z = [Z, L]; end end disp(Z); И в настройках Матлаба задал Numeric display: compact. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Swup 0 28 ноября, 2017 Опубликовано 28 ноября, 2017 · Жалоба Скобки круглые для индексов массивов и параметров функций, квадратные для явного задания массивов, фигурные - для 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 28 ноября, 2017 Опубликовано 28 ноября, 2017 · Жалоба Спасибо! Бар уже применил. instrreset тоже всунул в начало скрипта. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться