2014-01-12 4 views
2

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

function out = intcon1(hObject, eventdata, handles) 
global comPort; 
a=fgetl(comPort); 
disp(a); 

a(a==' ') = ''; 
indexstart=strfind(a,'['); 
indexend=strfind(a,']'); 
measureddata=a(indexstart(1):indexend(1)); 
commas=strfind(measureddata,','); 

re1data=measureddata(2:(commas(1)-1)); 
re2data=measureddata((commas(1)+1):(commas(2)-1)); 
im1data=measureddata((commas(2)+1):(commas(3)-1)); 
im2data=measureddata((commas(3)+1):(commas(4)-1)); 
temp1data=measureddata((commas(4)+1):(commas(5)-1)); 
temp2data=measureddata((commas(5)+1):(commas(6)-1)); 

old_str=get(handle.re1, 'String'); 
new_str=strvcat(old_str, re1data); 
set(handles.listbox8, 'String', re1data); 

Теперь я пытаюсь поместить данные в ListBox. Это только первое значение. Проблема в том, что Matlab продолжает говорить, что ручки не определены. Но я уже cound создать кнопку, которая очищает ListBox, используя следующий код:

function clearlists_Callback(hObject, eventdata, handles) 
% hObject handle to clearlists (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 
set(handles.listbox8, 'String', ''); 

Кто-нибудь есть идея, что проблема и как это исправить?

+0

Это вызов последовательного порта с использованием 'BytesAvailableFcn'? Если так, вы ожидаете полностью неправильные параметры. – Notlikethat

+0

Да, он использует BytesAvailableFCN. Какими могут быть параметры? – bdvd

+0

Можете ли вы разместить код, в котором вы создаете объект serial, и определить BytesAvailableFCN? – jerad

ответ

0

Вы, вероятно, определили свой BytesAvailableFCN, используя синтаксис функции ручки без дополнительных аргументов, как этого

s.BytesAvailableFCN = @myfun(); 

Вместо этого, вы должны определить свой обратный вызов, используя массив ячеек, как описано here in the documentation. Например,

s.BytesAvailableFCN = {'myFun', handles}; 

handles уже должен быть определен и в вашем рабочем пространстве, когда эта линия запускается.

+0

Благодарим за помощь. Это была проблема. – bdvd

1

Serial port callbacks отличные от GUIDE callbacks. В случае обратного вызова последовательного порта ваш дескриптор объекта относится к объекту последовательного порта, и событие является последовательным событием. Третьего аргумента нет, поэтому handles не определено.

Если вы хотите получить ваш GUI ручки внутри этой функции вы должны сделать это в явном виде, подобно тому, как вы извлекая comport ручку - между прочим получать comport таким образом, вероятно, нет необходимости, так как я бы себе это тот же объект, который обратный вызов уже принимает как hObject.

Поскольку в этом случае handles является GUIDE-specific data, то «правильный» способ его получения будет:

handles = guidata(gcf); 

Если ваш GUI имеет несколько цифр, возможно, придется использовать findobj() вместо gcf(), чтобы получить правильный.

+0

ОК. Но как определить глобальную переменную для дескриптора? Согласно Matlab, дескрипторы списка не могут быть определены как глобальные или скопированы в глобальную переменную. – bdvd

+0

@bdvd Извините, оказывается, я немного ржавчивый по GUIDE, не коснувшись его годами - я проверил документацию и соответственно обновил ответ. – Notlikethat

Смежные вопросы