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

Einlesen von RS232-Meßwerte erzeugt 100% CPU-Last

 

Michael-Hagen
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 21.04.08
Wohnort: ---
Version: R2007b
     Beitrag Verfasst am: 28.05.2008, 14:36     Titel: Einlesen von RS232-Meßwerte erzeugt 100% CPU-Last
  Antworten mit Zitat      
Ich lese von einem Sensor Meßwerte über die serielle Schnittstelle ein und zeige sie in einem Textfeld an. Das funktioniert soweit einwandfrei. Allerdings ist der Prozeß schon nach kurzer Zeit ausgelastet und die Daten können kaum noch verarbeitet werden. Es werden zur Zeit einige hundert Werte pro Sekunde gesendet. Eine Darstellung in einem Diagramm ist dadurch so gut wie garnicht möglich.

Ist Matlab einfach so langsam oder ist meine Programmierung schlecht? Hier mal der Quelltext der eventgesteuerten RS232-Routine:

Code:

function PortEvent(obj,event)
global s A

A = fread(s,1,'int8'); %Ein Byte vom Comport lesen

set(findobj('Tag','edit2'),'String', A); %Wert in Textfeld schreiben


 


Und hier meine Comport-Initialisierung:
Code:

function ser_obj = openport()

popupmenu_Obj=findobj('Tag','popupmenu'); %Com-Port aus dem Popupmenü auslesen
val = get(popupmenu_Obj,'Value');
string_list = get(popupmenu_Obj,'String');
selected_string = string_list{val}

if length (instrfind) > 0 %noch geöffnete Ports schließen
    fclose (instrfind);
end

ser_obj = serial(selected_string,...
           'BaudRate', 9600,...
           'Parity', 'none',...
           'DataBits', 8,...
           'StopBits', 1,...
           'InputBufferSize', 1024,...
           'OutputBufferSize', 1024,...
           'Timeout', 2);
       
ser_obj.BytesAvailableFcnCount = 1;          
ser_obj.BytesAvailableFcnMode = 'byte';
ser_obj.BytesAvailableFcn = @PortEvent;


fopen(ser_obj);
disp ('COM-Port erfolgeich geöffnet');

 


Zuletzt bearbeitet von Michael-Hagen am 29.05.2008, 19:17, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen


outsider
Forum-Meister

Forum-Meister


Beiträge: 806
Anmeldedatum: 03.09.07
Wohnort: München
Version: R2012b
     Beitrag Verfasst am: 29.05.2008, 08:00     Titel:
  Antworten mit Zitat      
Sehr gut, dass Du gleich mit "BytesAvailableFcn & Co" arbeitest! Smile
Ich vermute die Hohe Last kommt Zustande, da die Datenportion (nur 1 Byte) viel zu klein ist. Der Overhead pro eingelesenen Byte ist dagegen sehr hoch (Callback aufrufen, Daten abholen, Grafik aktualisieren, ...) Das Kostet Zeit und in der Zeit kommen weitere Daten an, die gepuffert werden müssen. Wenn der Rechner nicht hinterher kommt (was offensichtlich ist) stockt der...

Ich würde an Deiner Stelle nicht 1 Byte auslesen, sondern etwas mehr. Versuche mit 1 KByte, oder paar Tausend bytes und checke wie Dein Rechner sich verhält - ich denke bei größeren Daten-Portionen wird der mehr "Luft zum Atmen" haben... Smile


MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
cis

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.07.2008, 00:29     Titel:
  Antworten mit Zitat      
Hi, outsider!
Ich habe das selbe Problem unter Matlab.
auf den COM-Port greife ich aber etwas anders zu:

fprintf(portObj,"myMessage"); %schreiben
portAnswer=scanf(portObj); %lesen

bei mir dauert die fprinf() etwa 30ms, fscanf dagegen ca.1ms.

wie lange dauert der zugraif bei Ihnen ?
(auf C++ kann ich alle 4ms eine Antwort bekommen, ohne probleme. Liegt also nicht am RS232 Gerät)

Haben Sie vielleicht schon eine Lösung oder erklärung für das Problem?
 
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.