Clear a persistent variable in a MATLAB Fcn block as serial object
Ältere Kommentare anzeigen
Hello! I am using following code for read data from serial port:
function y = fcn(u)
coder.extrinsic('only3')
coder.extrinsic('strncmp')
coder.extrinsic('serial', 'fopen','fread')
coder.extrinsic('get')
persistent s a b
y = uint8(zeros(2,1)); %signal is an uint8
if isempty(s)
% only do this the first time
s = serial('COM12','Terminator','', 'InputBufferSize', 1024);
a = '000';
b = false;
a = only3(get(s,'status'));
b = strncmp(a,'clo',3);
switch double(b)
case 1
fopen(s);
otherwise
fclose(s);
end
end
y = uint8(fread(s,[2 1],'uint8'));
Where 'only3' is my function that takes only the first 3 chars from a string. The problem is that communication does not terminate with simulation stopping. Switch case has no effect (I thought that it shuts down reading after an other run). How can I clear persistent variable 's' and reset the block after stopping?
Antworten (3)
Paul
am 26 Feb. 2014
clear fcn
Hi,
A MATLAB FCN Block is a bad idea here. Better would be a MATLAB LVL 2 S-function because you can better control your serial port. In the mdlStart you create your serial object and later in the mdlTerminate you close it propperly. In the mdlOutputs you calculate the signal as usual.
6 Kommentare
Marco
am 27 Feb. 2014
Friedrich
am 27 Feb. 2014
But at least it works ;)
Can you post your S-function here? Maybe something wasn't implemented efficiently.
Marco
am 27 Feb. 2014
Friedrich
am 28 Feb. 2014
So you create the serial object on the ML side and then pass it in to the S-Fcn at each call. This sounds like overhead to me. What happens if you create the serial object in the mdlInitializeSizes and make it a global variable? In that way you don't need to pass it in every time the S-Fcn is called. Does the performance get better?
In addition you are currently using a LVL 1 S-Fcn. I don't know if there might be a performance difference between LVL 1 and LVL 2 S-fcn.
Marco
am 28 Feb. 2014
Friedrich
am 3 Mär. 2014
Yes. You open the serial port in the mdlInitializeSizes and close it in the mdlTerminate.
Ryan Livingston
am 2 Apr. 2014
0 Stimmen
Another thought could be to use the serial port I/O blocks directly in Simulink. See the Blocks heading here:
I am not too familiar with them, but they may facilitate a simpler interface to your hardware.
These could perform the I/O and then you could process the data using the method of your choosing.
Kategorien
Mehr zu Texas Instruments C2000 Processors finden Sie in Hilfe-Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!