Clear a persistent variable in a MATLAB Fcn block as serial object

3 Ansichten (letzte 30 Tage)
Marco
Marco am 26 Feb. 2014
Beantwortet: Ryan Livingston am 2 Apr. 2014
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
Paul am 26 Feb. 2014
  1 Kommentar
Marco
Marco am 27 Feb. 2014
I tried that but it returns an error:
Open failed: Port: COM12 is not available. No ports are available. Use INSTRFIND to determine if other instrument objects are connected to the requested device. Block Gyro/Serial Read (#59) While executing: State During Action
where #59 points to 'fopen(s)' command

Melden Sie sich an, um zu kommentieren.


Friedrich
Friedrich am 27 Feb. 2014
Bearbeitet: Friedrich am 27 Feb. 2014
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
Marco am 28 Feb. 2014
Are you saying that I have to modify mdlInitializeSizes section as:
function [sys,x0,str,ts]=mdlInitializeSizes(stime)
global s
s = serial('COM12');
fopen(s)
sizes = simsizes;
sizes.NumContStates = 0;
sizes.NumDiscStates = 0;
sizes.NumOutputs = 2;
sizes.NumInputs = 0;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1; % at least one sample time is needed
sys = simsizes(sizes);
x0 = [];
str = [];
ts = [stime 0];
end
??? In this way it should call object creation and opening only one time, is it?
Friedrich
Friedrich am 3 Mär. 2014
Yes. You open the serial port in the mdlInitializeSizes and close it in the mdlTerminate.

Melden Sie sich an, um zu kommentieren.


Ryan Livingston
Ryan Livingston am 2 Apr. 2014
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 Simulink Functions finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by