ここで問題が発生した後、MATLAB Function ブロックを使用して関数を作成するための助けが必要です。次のリンクで、一部の人がそのブロックまたは s-function で解決したことを確認しました: http://www.mathworks.co.uk/matlabcentral/newsreader/view_thread/317910
http://www.physicsforums.com/showthread.php?t=595813
http://www.mathworks.de/matlabcentral/newsreader/view_thread/250266
だから私はこれで試しました:
function y = fcn(u)
coder.extrinsic('only3')
coder.extrinsic('serial', 'fopen','fread')
coder.extrinsic('set')
persistent s a
y = (zeros(2,1));
s = serial('COM12');
set(s,'Terminator','', 'InputBufferSize', 1024);
a = char('000'); % a-initialization for mxArray problems
a = only3(get(s,'status')); %to check if port is already opened calling custom function
if strncmp(a,'clo',3)==true
fopen(s)
else
fclose(s)
end
y = fread(s,[2 1],'uint8'); % I have to read some data from serial. This command works fine in the matlab command window.
only3
私が作成した関数はどこにありますか。文字列から最初の 3 文字を取得し、'status'
答えの 3 文字だけを比較する必要があります。
function let = only3(string)
let = string(1:3);
通信がすでに開かれているかどうかを知るために行いました。しかし、simulink はウィンドウとしてエラーを返します:
Call to MATLAB function aborted: Open failed: Port: COM12 is not available. No ports are available.
最初の反復でポートが開いた後、ポートを開こうとしていると思います。
編集:私はこれで私のコードを変更します:
function y = fcn(u)
coder.extrinsic('only3')
coder.extrinsic('strncmp') %like Phil say
coder.extrinsic('serial', 'fopen','fread')
coder.extrinsic('get')
persistent s a b
y = (zeros(2,1));
%%Phil の提案から抜粋:
if isempty(s)
% only do this the first time
s = serial('COM12','Terminator','', 'InputBufferSize', 1024);
a = '000';
b = false; %without this returns mxArray error.
end
a = only3(get(s,'status'));
b = strncmp(a,'clo',3);
if b == true
fopen(s)
else
fclose(s)
end
y = fread(s,[2 1],'uint8');
エラーとして返されます:
Unsuccessful read: OBJ must be connected to the hardware with FOPEN. Block MATLAB Function (#24) While executing: State During Action
ハイライトy
表現。
更新編集: 次のコードで解決しました:
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'));
ただし、以下でコメントしたように、シミュレーションを停止するたびに、通信が閉じられないため、Matlab を再起動する必要があります。これは、シミュレーションを再試行すると、「最初のエラー」が返されるためです。
Call to MATLAB function aborted: Open failed: Port: COM12 is not available. No ports are available.
何故かはわからない。M コード レベル 1 S-Function の関数のfclose(s)
ように停止するすべてのシミュレーションを実行するものがあるでしょう。mdlTerminate
いくつかの提案?