2012-01-05 4 views
7

で仮想COMMポートを使用してデータを読み込むMatlabスクリプトを作成しました。私はmfileで大量の信号処理を行っています。GUIDEを使用したMatlab GUI:グラフを動的に更新する

次に、情報を要約として表示するコンパクトなGUIを用意する必要があると感じました。

私は最近、Matlabの組み込みGUIツールGUIDEをさらに掘り出して読み始めました。私はいくつかのチュートリアルに続き、ボタンを押した後にの後に私のGUI上にグラフを表示させることに成功しました。

ただし、GUIをリアルタイムで更新します。私のデータベクトルは常に更新されています(COMMポートからのデータ読み込み)。 GUIをに更新するには、ボタンを押して更新するのではなく、新しいデータでグラフを更新します。誰かがバックグラウンド更新の正しい方向に私を向けることができますか?ここで

は、GUIのため、現在、関連するコードです:

% --- Executes on button press in pushbutton1. 
function pushbutton1_Callback(hObject, eventdata, handles) 
% hObject handle to pushbutton1 (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 
global data 
global time 

% Time domain plot 
axes(handles.timeDomainPlot); 
cla; 
plot (time, data); 

EDITは、コードを変更:

% --- Executes on button press in pushbutton1. 
function pushbutton1_Callback(hObject, eventdata, handles) 
% hObject handle to pushbutton1 (see GCBO) 
% eventdata reserved - to be defined in a future version of MATLAB 
% handles structure with handles and user data (see GUIDATA) 

%Setting it to display something when it ends 
% t = timer('TimerFcn', 'timerOn=false; disp(''Updating GUI!'')',... 
t = timer(... 
      'TasksToExecute', 10, ... % Number of times to run the timer object 
      'Period', 3, ...     
      'TimerFcn', GUIUpdate()); 

%Starting the timer 
start(t) 

function GUIUpdate() 
global data 
global time 
%Parameters below axes 
    global min 
    global max 
     % Time domain plot 
    axes(handles.timeDomainPlot); 
    cla; 
    plot (time, data); 
    %Other parameters: 
    set(handles.mean, 'String', mean); 
    set(handles.max, 'String', max); 

私が手にエラーがある:

??? Error using ==> GUI_Learning>GUIUpdate 
Too many output arguments. 

Error in ==> 
@(hObject,eventdata)GUI_Learning('pushbutton1_Callback',hObject,eventdata,guidata(hObject)) 


??? Error while evaluating uicontrol Callback 
+0

可能な複製:http://stackoverflow.com/questions/1007385/getting-matlab-timer-to-update-matlab-guide-gui – Nzbuu

+0

@ c0d3rz timerfcnコールバックの定義については、このリンクを参照してください。http:// www。 mathworks.com/help/techdoc/matlab_prog/f9-39541.html#f9-42494 'timerfcn'を@GUIUpdateに設定し、GUIUpdateを2つの入力 'GUIUpdate(obj、event)'に変更してみてください。 'obj'はタイマーオブジェクトのハンドルになり、 'event'はそれがどのように呼び出されたかについていくつかの詳細を持ちます。デフォルトでは、タイマー関数のコールバックには、少なくとも2つの引数が渡されます。私はそれがあなたのエラーの正確な原因であるかどうかは分かりませんが、あなたのサンプルは正しく見えません。私が今日後でチャンスを得るなら、私はサンプルタイマーを投稿しようとします。 –

答えて

10

ここでは、timerFcnコールバックでタイマーを使用する例を示します。私は1つの軸と1つのボタンで簡単なGUIを作った。

オープニング機能では、プロットを初期化してタイマーを作成します。開始ボタンのコールバックでは、タイマーを開始し、データの操作を開始します。タイマー関数のコールバック関数は、そのハンドルを介してラインのyデータを更新します。以下はGUIのM-ファイル(切り取ら初期化セクションと出力FCNから、関連する機能が

function testTimer_OpeningFcn(hObject, eventdata, handles, varargin) 
global y x 
x = 0:.1:3*pi; % Make up some data and plot 
y = sin(x); 
handles.plot = plot(handles.axes1,x,y); 
handles.timer = timer('ExecutionMode','fixedRate',... 
        'Period', 0.5,... 
        'TimerFcn', {@GUIUpdate,handles}); 
handles.output = hObject; 
guidata(hObject, handles); 

% --- Executes on button press in startButton. 
function startButton_Callback(hObject, eventdata, handles) 
global y x 
start(handles.timer) 
for i =1:30 
    y = sin(x+i/10); 
    pause(1) 
end 

function GUIUpdate(obj,event,handles) 
global y 
set(handles.plot,'ydata',y); 

あなたは停止ボタンは、あなたのGUIが構成されている方法に応じてタイマーを停止することをお勧めします。で、データがどのように/でした。更新

編集:オブジェクトへの個々のハンドルは、あなたが得る()関数で読み込むことができる性質の束が含まれてい

か:基本はこれのいくつかは、かなり基本的であり、あなたはすでにそれを知っている可能性の情報を処理しますset()関数で設定します。たとえば、私のGUIで何らかの理由でstartButtonのテキストを変更したいとします。

set(handles.startButton,'String','Something Other Than Start'); 

コード内にブレークポイントを設定することもできます(ボタンを押すなど)。ハンドル構造体を使用して周りを再生することができます。さまざまなオブジェクトでget()コマンドを実行すると、そのプロパティを知ることができます。

ハンドル構造には、GUIのオブジェクトとそこに保存するのに便利なカスタムアイテムのハンドルがすべて含まれています。ほとんどのGUIコールバックは自動的にハンドル構造体に渡されるため、GUIのすべての部分に簡単にアクセスできます。

Ex。 'startButton'コールバックは自動的にhandlesに渡されました。だから私はhandles.timerでタイマーオブジェクトに簡単にアクセスできました。

私はhandlesにカスタムのものを貼り付けてくれます。開始関数では、他のコールバック(button pressやtimerFcnコールバックなど)で便利だと分かっていたので、ハンドル構造体handles.timerhandles.plotに新しい項目を追加しました。

しかし、これらのものを永続的に保存するには、 'guidata'関数を使用する必要があります。この関数は基本的に、変更されたhandles構造体を格納するか、それを呼び出す方法に応じてhandlesのコピーを取得します。したがって、開始関数の次の行は、修正されたハンドル構造(.timerおよび.plotが追加された)をメインGUIに格納しています。

guidata(hObject,handles); 

基本的にあなたがhandlesで何かを追加し、いつでもあなたが変更を永続化するために、そのラインを持っている必要があります。

今それを呼び出す他の方法は次のとおりです。

handles = guidata(hObject); %hObject can be any handle who is a child of the main GUI. 

これは、GUIのためのハンドル構造体を取得します。

最後にhandles.output = hObjectは、GUIを起動したときのデフォルト出力です。このh = myGUI;のようなMatlabのコマンドラインからあなたのGUIを呼び出すと、GUIへのハンドルが返されます。

+0

エアロエネルギーに感謝します。私はあなたのコードの助けを借りて私が望んでいた方法を働かなければならないと思います。私は本当に助けに感謝します。私はウェブサイトでタイマーのヘルプを読んだが、本当にそれを正しく得ることができなかった、あなたのコードスニペットは本当に助けた。あなたが私を助けるために関連コードを書き留める時間を取ったことは驚きです。再度、感謝します! – c0d3rz

+0

これら2行のコードで何をしてください。 handles.output = hObject; guidata(hObject、handles); – c0d3rz

+0

私はこのハンドルを使用するのか分かりません。*記法。私はハンドルを使ってMatlabのヘルプファイルを読んでいましたが、あまり意味がありませんでした。 – c0d3rz

1

あなたが使用する必要がありますtimer object。コールバックをプロットを更新する関数に設定します。

+0

代替手段はありますか? – c0d3rz

+0

私の知る限りではありません。このようにすることができない理由はありますか? – Nzbuu

+0

あなたは私の編集を見ていただけますか?私はタイマ機能を適切に使用することができません。 – c0d3rz

1

Making Graphs Responsive with Data Linking linkdataコマンドを見てください。

複数の図で同じ変数がプロットに表示される場合は、 のいずれかのプロットを変数にリンクできます。 コンサートでリンクされたプロットをデータブラシ付きグラフにマークアップするだけでなく、その 所有者にも使用できます。プロットをリンクするあなたはグラフがデータブラッシングを通じて変数を変更するベースワークスペース内または関数

  • 内の変数の変化あなたは変数エディターで変数を変更したときにグラフが応答作成し、コマンドライン
  • に応えてください

    • することができますそれは

    ウォッチウィンドウが使用する場合に便利ですデバッグ目的のためのグラフィカルな「ウォッチウィンドウ」を作成し、一度

  • それらの異なるグラフィック表現に影響を与えますMATLAB言語で記述します。 の例では、 コードをステップ実行するためにデータ処理アルゴリズムを改良すると、 関数がステートメントを実行するため、変数の変化にグラフが応答することがわかります。

  • 私は、下記のように迅速かつ汚れたテストを行いましたが、これはGUIの機能とはどのように機能するのか分かりませんが、そのトリックを行う可能性があります。

    注1:グローバルyを実際にプロットの自動更新を表示するように変更するサブルーチンにブレークポイントを追加する必要がありました。データが急速に変更される場合は、描画、一時停止、またはタイマーの組み合わせが必要な場合があります。

    function testLinking() 
    global x y 
    %Links failed if the global did not also exist in the base workspace 
    evalin('base','global x y'); 
    x = 0:.1:3*pi; % Make up some data and plot 
    y = sin(x); 
    
    h = plot(x,y,'ydatasource','y','xdatasource','x'); 
    linkdata on 
    testSub 
    
    function testSub() 
    %Test to see if a sub can make a linked global refresh 
    global x y 
    for i = 1:10 
        %This should automatically update the plot. 
        y = sin(x+i/10); 
    end 
    

    編集:そこにあなたの関数がどのように構成されるかに応じて、グローバルの使用を回避する方法もあります...しかし、私はずっとに掘り下げるための時間を持っていません。

    +0

    ありがとう、私の質問ではっきりしていなかった。グラフを変更するだけでなく、いくつかの静的テキストボックスもあります。これもまた更新したいものです。それはタイマーが行く方法です... – c0d3rz

    +0

    @ c0d3rzタイマーを稼働させるための私の他の答えを参照してください。 –

    0

    プロット関数を実行するシリアルオブジェクトにコールバックを追加できます。オブジェクトの 'BytesAvailableFcn'イベントへのコールバックを添付する必要があります(comオブジェクトのプロパティの詳細については、thisを参照してください)。

    comポートで利用可能なバイトがある場合、matlabに特定の関数を実行するよう指示します。あなたの場合、それはGUIを更新する関数になります。受信データを最初に処理する必要がある場合、コールバック関数はまず信号処理を行い、プロットコマンドを実行します。

    +0

    ありがとうございました。しかし、私は私の質問ではっきりしていませんでした。グラフを変更するだけでなく、いくつかの静的テキストボックスもあります。これもまた更新したいものです。タイマーが行く方法です... – c0d3rz

    +0

    また、get/setを使ってボックスを更新することもできます。ことは、私はあなたのコードの論理を知らないということです。 – Jorge

    関連する問題