Matlab serial/rs232 sendet zu langsam

Gast #1379917
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.matlab/browse_thread/thread/770c29792893e31d/5e8ca900a8b9946b#5e8ca900a8b9946b


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.

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

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

11
set(serobjw, 'OutputBufferSize', 100) ;     
12
      
13

14
fopen(serobjw) ;
15

16

17

18
speed = 100;
19
tempCountUp = 1;
20

21
tempStringPart1 = '['; 
22
tempStringPart2 = ']';
23

24

25

26
while (1)
27
    
28
    cString = sprintf('%s%05.0f%s', tempStringPart1,speed,tempStringPart2);
29
    
30
    if (strcmp(serobjw.TransferStatus,'write') == 0)    
31
        fprintf(serobjw,cString,'async');
32
    end
33
    
34
    if(speed == 1) 
35
        tempCountUp = 1; 
36
    end
37
    
38
    if(speed == 1000)
39
        tempCountUp = 0; 
40
    end
41
    
42
    if(tempCountUp == 1) 
43
        speed = speed + 1; 
44
    end
45
    
46
    if(tempCountUp == 0)
47
        speed = speed - 1; 
48
    end
49

50
    cString
51
  
52
    pause(0.01);
53

54
end
#1428716
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren