Вложенный обратный вызов Bluetooth в графическом интерфейсе Matlab

Я знаю, что обратные вызовы графического интерфейса Matlab обсуждались здесь сотни раз, но я думаю, что столкнулся с особой проблемой.

Я знаю, как обмениваться данными между различными обратными вызовами графического интерфейса (я использую структуру дескрипторов, как описано в документацию). Я создал свой графический интерфейс с помощью GUIDE.

Есть одна кнопка, которая создает дескриптор bluetooth в своей функции обратного вызова, которая отлично работает. Как только соединение Bluetooth установлено и получено определенное количество байтов, запускается функция обратного вызова Bluetooth (устанавливается bluetoothhandle.BytesAvailavailableFcn = @rdatac_Callback).

Заголовок моей функции обратного вызова Bluetooth выглядит так:

function rdatac_Callback(hObject, eventdata)

hObject содержит дескриптор bluetooth, eventdata событие, вызвавшее обратный вызов (в данном случае оно называется «BytesAvailable»).

Эта функция находится в том же файле, что и все другие обратные вызовы GUI. Проблема в том, что я не могу получить доступ к структуре дескрипторов графического интерфейса в обратном вызове bluetooth. Я попытался добавить «ручки» в качестве третьего входного параметра, но тогда он пуст. Я также попытался создать свою собственную структуру дескрипторов с помощью

h = guidata(findobj('Name','BCI'));

где BCI — имя окна GUI. Это отлично работает в любой функции обратного вызова с графическим интерфейсом, но внутри обратного вызова Bluetooth он не может найти другие элементы, поэтому обратный вызов Bluetooth имеет свою собственную «область действия».

Итак, мой вопрос: как я могу поделиться всеми дескрипторами графического интерфейса с моей функцией обратного вызова Bluetooth? Мой обходной путь заключался в использовании глобальной рабочей области, но я хотел бы использовать структуру дескрипторов, если это возможно.


person Andy    schedule 29.12.2014    source источник


Ответы (1)


Создайте обратный вызов Bluetooth с функцией подписи rdatac_Callback(hGuiObject, hBtObject, eventdata). Теперь при создании объекта bluetooth в вашем GUI-Callback у вас есть дескриптор вашего GUI-объекта. Это должно быть передано в ваш rdatac_Callback. Вы можете добиться этого, используя дескриптор функции @(hBtObject,eventdata)rdatac_Callback(hGuiObject, hBtObject, eventdata). Функция rdatac_Callback всегда вызывается с тремя нужными вам параметрами, но анонимной функции нужно передать только два. hGuiObject берется из рабочей области, где вы создали анонимную функцию.

person Daniel    schedule 29.12.2014
comment
Еще одна вещь: я попытался изменить поле handles.data в обратном вызове Bluetooth и сохранить его с помощью guidata(handles.figure1,handles) точно так же, как и в обратных вызовах с графическим интерфейсом (только здесь я использовал handles.figure1 вместо hObject, поскольку в обратном вызове Bluetooth нет hObject). ), но данные никогда не сохраняются. Каждый раз, когда запускается обратный вызов Bluetooth, handles.data пусто. Я использовал handles.data = []; в GUI Opening Fcn, чтобы объявить это новое поле в структуре handles. - person Andy; 30.12.2014