0

ここで問題が発生した後、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いくつかの提案?

4

2 に答える 2

1

永続変数の初期化が間違っています。おそらくあなたが本当に望んでいるのは

persistent s a
if isempty(s)
   % only do this the first time
   s = serial('COM12');
   a = '000';
end
于 2014-02-23T00:12:53.047 に答える
0

ポートが閉じていない場合は、instrfindコマンドを使用して計測器の配列を取得してfcloseから、通信を閉じるために使用できます。

いえ

q=instrfind();

%%select閉じるインデックス ポート。

fclose(q(x)); where x is the index

そして、すべての楽器をクリアする必要がある場合は、delete(q);

よろしくお願いします。

于 2015-06-20T01:18:08.080 に答える