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


von Simon (Gast)


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

von Niels K. (niels-k)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.