|
Отображение данных в МАТЛАБ в режиме реального времени |
|
|
|
Jul 25 2012, 09:44
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(Mityan @ Jul 25 2012, 13:11)  Получаю байты с СОМ-порта. Как мне сделать красивый график, чтобы сидеть и наблюдать, как в него с течением времени точки добавляются?
Задаю вопрос, потому что не могу даже сформулировать это подходящим для поисковика образом. Google(matlab com read) - третья строчка сверху. А вообще проще в терминалке такой график смотреть:
Эскизы прикрепленных изображений
|
|
|
|
|
Jul 25 2012, 09:48
|
Частый гость
 
Группа: Свой
Сообщений: 133
Регистрация: 7-08-10
Из: Мурманск
Пользователь №: 58 796

|
Цитата(Mityan @ Jul 25 2012, 13:11)  Задаю вопрос, потому что не могу даже сформулировать это подходящим для поисковика образом. Аналогичной проблемой занимался, потом решил что это все от лукавого и стал накапливать буфер и выводить данные целиком и уже не в matlab (для моей задачи это было допустимо). Ваш вопрос предполагает, что Вы уже умеете в M-коде инициализировать com-порт, читать его и что-то от туда получать в задержанном времени (через буфер). По реальному времени на вскидку нашел в M-коде что-то похожее, не проверял. Изначально у меня была идея вообще в simulink это делать, используя библиотеку COMMSTR.
|
|
|
|
|
Jul 25 2012, 10:13
|
Частый гость
 
Группа: Участник
Сообщений: 78
Регистрация: 5-07-11
Пользователь №: 66 068

|
Вот код: Код %% Initial variables clear all; B_rate = 57600; % Baud rate Rx_packet_len = 25; % Received packet length Rx_counter = 0; % Packet counter Packets_per_second = 50; Rx_buffer = zeros(Rx_packet_len,1); Packet_header = hex2dec('7777'); %% Open port s = serial('COM3','BaudRate',B_rate); fopen(s); %% Read cycle while 1 % Looking for packet header a = fread(s,1); if a == bitshift(Packet_header,-8) % Byte 1 a = fread(s,1); if a == bitand(Packet_header,255) % Byte 2 fread(s,Rx_packet_len-2); break; end end end while 1 % Infinite operation loop A = fread(s,Rx_packet_len); Rx_counter = Rx_counter + 1; if Rx_counter == Packets_per_second Rx_counter = 0; disp( dec2hex( A(1)*256 + A(2) ) ); end end В первом бесконечном цикле просто ищу заголовок, чтобы синхронизироваться по нему. Затем во втором бесконечном цикле намереваюсь разбирать пакет на компоненты и выводить интересующие параметры в режиме реального времени (типа осциллограф) вместо вот этого куска кода с Rx_counter. Ссылка на функцию datetick интересная, буду изучать, возможно, это именно то что надо. Мне просто кажется, что на каждом цикле (или хотя бы на каждой секунде) просто делать плот - неоптимально. В терминалке не подойдет, а вдруг я захочу некие операции еще произвести с данными, а потом уже выводить? Симулинк я очень люблю, но это наверное не совсем для реал-тайм приложение. Для тех, кто может этот мой кусок использовать: остановка Ctrl+C и перед новым запуском не забывайте fclose(s) делать, а то матлаб придется перезагружать (он просто уже этого сом-порта не увидит).
Сообщение отредактировал Mityan - Jul 25 2012, 10:05
|
|
|
|
|
Jul 25 2012, 10:54
|
Частый гость
 
Группа: Свой
Сообщений: 106
Регистрация: 11-11-10
Из: Санкт-Петербург
Пользователь №: 60 826

|
Реализовывал приём и передачу данных в Matlab через COM-порт, используя графический интерфейс (GUI), где по таймеру считывал данные и отображал их. Часть кода: Код % Функция настройки соединения по последовательному порту function connect_Callback(hObject, eventdata, handles) handles.ser = serial('COM2'); set(handles.ser,'BaudRate',9600); fopen(handles.ser);
%Обработка принятых данных function TmrFcn(src,event,handles) handles = guidata(handles); if handles.ser.BytesAvailable > 0 % Чтение принятого байта x = fread(handles.ser,handles.ser.BytesAvailable,'uchar'); % дальнейшая обработка и вывод на экран % ... end
% Настройка таймера для чтения принятых данных handles.guifig = gcf; handles.tmr = timer('TimerFcn',{@TmrFcn,handles.guifig},'BusyMode','Queue',... 'ExecutionMode','FixedRate','Period',0.1);%timer guidata(handles.guifig,handles); start(handles.tmr);
|
|
|
|
|
Jul 31 2012, 11:38
|
Частый гость
 
Группа: Участник
Сообщений: 78
Регистрация: 5-07-11
Пользователь №: 66 068

|
Пытаюсь реализовать GUI.
Помогите, пожалуйста, с синтаксисом.
Почитал много форумов matlab.exponenta.ru, но не нашел похожего примера. Все успешно передают в функцию таймера параметры и рисуют графики. А возвратить значение как? Конкретно, у меня есть handles.transaction_counter, который инкрементируется по нажатию кнопки одиночной посылки, а также при нажатии кнопки циклического опроса (она-то и запускает таймер). Хочу, чтобы на экране счетчик бежал, да не знаю, как с возвратом параметров справиться.
Если пишу handles.TMR = timer( 'TimerFcn',{@Timer_Func, handles}, ... то при вызове start(handles.tmr) пишет -
??? Error while evaluating TimerFcn for timer 'Polling Timer' H must be the handle to a figure or figure descendent.
Если передаю handles.TMR = timer( 'TimerFcn',{@Timer_Func, handles.transaction_counter, ... Забыл уже, что пишет, но тоже ругается.
Пробовал объявить счетчик как global - вообще не понимаю, как должно работать, ни одна функция этого глобального счетчика не видит.
В хелпах матлаба ничего по этим поводам нет. Буду очень признателен.
Сообщение отредактировал Mityan - Jul 31 2012, 11:53
|
|
|
|
|
Aug 19 2012, 07:27
|

Гуру
     
Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287

|
Дело было довольно давно и подробностей я уже не помню. Программка предназначалась для приёма последовательности из трёх 16-битных переменных (названных R, G, B ), разделённых пробелом, и вывода на экран, а также сохранения в лог-файле. Можно было выводить не каждую точку, а усреднять по нескольким значениям. Вряд ли Вас устроит в готовом виде, но, возможно, будет полезной как пример.
Terminal.rar ( 3.18 килобайт )
Кол-во скачиваний: 306
|
|
|
|
|
Aug 21 2012, 07:54
|
Частый гость
 
Группа: Участник
Сообщений: 78
Регистрация: 5-07-11
Пользователь №: 66 068

|
Цитата(Herz @ Aug 18 2012, 13:18)  А зачем?
Я такую программку в своё время написал сам. Почти без навыков MATLABа. Это достаточно просто. Если хотите, выложу код. Вы знаете, наверняка очень многие из задаваемых здесь вопросов вам покажутся достаточно простыми. Спросите всех, зачем они их задают.
|
|
|
|
|
Aug 22 2012, 06:13
|
Частый гость
 
Группа: Участник
Сообщений: 78
Регистрация: 5-07-11
Пользователь №: 66 068

|
Цитата(Herz @ Aug 21 2012, 18:55)  Это как раз понятно. Непонятно, зачем Вы код выкладывали. Для критики, для поиска ошибок, похвастать или в качестве подарка? Получилось, будто сами себя спросили и сами ответили. Если б хвастал, написал бы: смотрите, какой у меня классный код!  Хотя идеального кода не существует. Конечно, для того, кому это может потом понадобиться
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|