WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Daten in GUI plotten

 

AndreSc
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 19.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.09.2013, 12:20     Titel: Daten in GUI plotten
  Antworten mit Zitat      
Hallo,

ich habe ein Problem Daten in einer grafischen Oberfläche zu plotten.

Ich habe ein Gerät, dass Puls, Herzfrequenz usw mist. Die Daten sollen dann über Bluetooth eingelesen werden und in einer grafischen Oberfläche angezeigt werden.


Code:

% --- Executes just before bioGui is made visible.
function bioGui_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to bioGui (see VARARGIN)

% Choose default command line output for bioGui)
handles.z =uint16([]);
handles.opt=uint16([]);
handles.indata=uint16([]);
handles.device = varargin{1};
handles.s = serial(handles.device);
handles.s.BaudRate = 115200;
handles.s.DataBits = 8;
handles.s.StopBits = 1;
handles.s.Parity = 'none';
handles.s.TimeOut = 0.5;
handles.s.TimerPeriod = 0.252;
handles.s.Terminator = '';
handles.s.TimerFcn = {@serialTimerFunction,handles};
handles.s.BytesAvailableFcnCount = 93;
handles.s.BytesAvailableFcn = {@serialBytesAvailableFcn,handles};
handles.s.BytesAvailableFcnMode='Byte'
 



Hier die Funktion, die die Daten plotten soll.
Code:

function serialBytesAvailableFcn(hObject, eventdata, handles)
try
    input = fread(handles.s,handles.s.BytesAvailable);
catch
    input = zeros(64:1);
end
ekgData= getEkgData(input).';
[handles.indata,handles.z,handles.opt] = buffer([handles.z;ekgData],320,256,handles.opt);

%guidata(hObject, handles);

plot(handles.axes1,handles.indata);
 



Heraus kommt folgendes Bild


Ich habe also immer 256 mal den Wert 0. Danach die richtigen Werte.
Der Plan war eigentlich, dass die Werte so von rechts nach links durchgeschoben werden.

Ich hatte schon etwas gefunden, dass man die handles-Struktur aktualisieren soll, aber da bekomme ich die Meldung:
"Error using guidata (line 89)
H must be the handle to a figure or figure descendent."

Habt ihr vielleicht einen Tipp für mich?
Vielen dank schonmal.

Viele Grüße
Andre
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 13.09.2013, 14:34     Titel:
  Antworten mit Zitat      
Hallo,

die ersten beiden Inputs von BytesAvailableFcn haben ja nichts mit der GUI zu tun. Damit weiß guidata nicht, in welcher GUI was aktualisiert werden soll.

Versuch mal:
Code:
guidata(handles.figure1, handles);

oder
Code:
guidata(handles.axes1, handles);


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
AndreSc
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 19.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.09.2013, 10:27     Titel:
  Antworten mit Zitat      
Vielen Dank für die Antwort.

Leider funktioniert das nicht. Sad
Hat jemand noch eine eine Idee?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.09.2013, 10:30     Titel:
  Antworten mit Zitat      
Hallo,

was passiert, wenn du das versuchst?
Gibt es eine Fehlermeldung? Welche? Unerwartetes Verhalten? Inwiefern?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
AndreSc
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 19.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.09.2013, 11:37     Titel:
  Antworten mit Zitat      
Das Verhalten ist das gleiche: geplottet wird mit anfangs 0en und irgendwann kommen Daten.

Eine Fehlermeldung erhalte ich nicht.


Ich habe in die Funktion noch ein disp(handles) eingefügt. Und man sieht, dass die Daten nicht aktualisiert werden. Bei Start werden einmal alle Hanldes angezeigt ud dieses Bild ändert sich nicht.

Code:

figure1: 685.1028
stopButton: 518.1029
axes1: 513.1029
debug: 512.1029
startButton: 690.1028
FileMenu: 686.1028
CloseMenuItem: 689.1028
PrintMenuItem: 688.1028
OpenMenuItem: 687.1028
output: 685.1028
 z: []
opt: []
indata: []
input: []
device: 'com5'
s: [1x1 serial]
 



Meine Idee war jetzt das so zu machen:
Code:

function serialBytesAvailableFcn(hObject, eventdata, handles, objH)
disp(handles);
try
    handles.input = fread(handles.s,handles.s.BytesAvailable);
catch readError
    updateDebugInformation(handles,readError.identifier);
end
ekgData= getEkgData(handles.input).';
[handles.indata,handles.z,handles.opt] = buffer([handles.z;ekgData],320,256,handles.opt);
guidata(objH, handles);
plot(handles.axes1,handles.indata);
 


Und entsprechen in der OpneingFcn das so zu ändern.

Code:

function bioGui_OpeningFcn(hObject, eventdata, handles, varargin)
...
handles.s.BytesAvailableFcn = {@serialBytesAvailableFcn,handles,hObject};
 



Allerdings funktioniert es auch nicht und gibt auch keine Fehlermeldung.

EDIT:
Wenn ich eine andere Funktion aufrufe
Code:

function stopButton_Callback(hObject, eventdata, handles)
% hObject    handle to stopButton (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
disp(handles);
if strcmp(handles.s.status,'open')
    fclose(handles.s);
end
 



Sind in den Variablen Werte drin:
z: [0x1 uint16]
opt: [256x1 uint16]
indata: [320x1 uint16]
Private Nachricht senden Benutzer-Profile anzeigen
 
AndreSc
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 19.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.09.2013, 12:45     Titel:
  Antworten mit Zitat      
Hi,

ich hab den Fehler gefunden:

In der OpeningFcn habe ich nun folgendes geändert:
Code:

handles.s.TimerFcn = {@serialTimerFunction,hObject};
handles.s.BytesAvailableFcn = {@serialBytesAvailableFcn,hObject};
 


Und in den jeweiligen Funktionen habe ich dann die handles ausgelesen:

Code:

function serialBytesAvailableFcn(hObject, eventdata, objH)
handles = guidata(objH);
 


Und nun klappt es.

Danke nochmals.
Private Nachricht senden Benutzer-Profile anzeigen
 
Rek

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.09.2013, 12:47     Titel:
  Antworten mit Zitat      
Bei erstmaligen aufrufen der "serialBytesAvailableFcn" sind doch auch keine
Daten vorhanden (s. Initialisierung) -> müsstes den disp-Aufruf mal ans Ende der
Callback setzen.
Zu deinen Hauptproblem:
Wenn ichs verstanden hab dann werden die Daten zumindest beim ersten aufruf richtig
dargestellt. Zum Aktualisieren/Durchlaufen der Daten muss du die Funktion doch irgendwo
in ne Schleife packen, was aus deinen bisherigen Code-Auszügen nicht ersichtlich ist.
Müsste mal deine StartCallback posten mit dem Aufruf der "serial...Fcn"! Dann kann man
dir leichter weiterhelfen.

Gruß rek
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.