mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Matlab serial/rs232 sendet zu langsam


Autor: Simon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(Ich hab das schon im DSP Bereich gepostet und meine da ist es im 
falschen Forum.)

---------------------------------------------
Messwert vom Sensor empfangen:
Sensor ---> µC ---> RS232 ---> Matlab

Sollwert senden:
Matlab ---> RS232 ---> µC ---> Aktor
---------------------------------------------
(alles natürlich in Echtzeit)


Hi, also ich hab es jetzt soweit hinbekommen dass ich senden kann.
Irgnedwie ragiert aber mein Mikrocontroller viel zu langsam auf die
Befehle.
Ich hab gemerkt das Matlab die Daten irgendwie Puffert und dann Stück
für Stück weitergibt. Also der Flashenhals ist (glaube ich zu mindest)
bei Matlab. Breche ich die While-Schleiche ab bewegt sich mein Motor
immer noch.

Hier schreibt einer, das in Matlab der Sender ( fprintf(...) ) Process 
eine sehr kleine Priorität hat und dadurch anscheinend es zum 
Geschwindigkeitseinbruch kommt.
http://groups.google.com/group/comp.soft-sys.matla...


Ich hab jetzt ca. 4 Stunden lang gesucht und bin nicht weitegekommen.

Hier mein Skript:
Eine Zahl wird im 10 ms Takt von 1 bis 1000 hoch und wieder
runtergezählt und dabei jeweils einmal rausgesendet.

Würde mich sehr über Hilfe freuen.

% Creating serial port object
serobjw = serial('/dev/cu.SERIAL1-SPP-1'); 

%Set connection properties
serobjw.Baudrate = 115200;        % Set the baud rate at the specific value
set(serobjw, 'Parity', 'none') ;     % Set parity as none
set(serobjw, 'Databits', 8) ;        % set the number of data bits
set(serobjw, 'StopBits', 1) ;        % set number of stop bits as 1
set(serobjw, 'FlowContro', 'none') ; % set FlowContro to none

set(serobjw, 'OutputBufferSize', 100) ;     
      

fopen(serobjw) ;



speed = 100;
tempCountUp = 1;

tempStringPart1 = '['; 
tempStringPart2 = ']';



while (1)
    
    cString = sprintf('%s%05.0f%s', tempStringPart1,speed,tempStringPart2);
    
    if (strcmp(serobjw.TransferStatus,'write') == 0)    
        fprintf(serobjw,cString,'async');
    end
    
    if(speed == 1) 
        tempCountUp = 1; 
    end
    
    if(speed == 1000)
        tempCountUp = 0; 
    end
    
    if(tempCountUp == 1) 
        speed = speed + 1; 
    end
    
    if(tempCountUp == 0)
        speed = speed - 1; 
    end

    cString
  
    pause(0.01);

end


Autor: Niels Keller (niels-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gab es eine Lösung für das zeitkritische Problem?

Beim Einlesen ist mir dieses Pufferverhalten auch aufgefallen. Im Fall 
das keine Daten mehr ankommen, werden irgendwelche bereits erhaltenen 
Datensätze übertragen. Ich konnte mir da nur mit Nummerierung der 
Datenpakete helfen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.