2017-08-07 7 views
-1

私のプロジェクトでは、MATLABコードをC++に移行する責任があります。以下のコードは、コンピュータからマイクロコントローラへのシリアル通信を指します。関数CreatePackageは、MATLABのfwrite(シリアル)関数を使用してマイクロコントローラに送信されるパッケージを生成します。このMATLABコードに相当するC++とは何ですか?

その後、
function package = CreatePackage(V) 
for ii = 1:size(V,2) 
    if V(ii) > 100 
     V(ii) = 100; 
    elseif V(ii) < -100 
     V(ii) = -100; 
    end 
end 

vel = zeros(1, 6); 
for ii = 1:size(V,2) 
    if V(ii) > 0 
     vel(ii) = uint8(V(ii)); 
    else 
     vel(ii) = uint8(128 + abs(V(ii))); 
    end 
end 

package = ['BD' 16+[6, vel(1:6)], 'P' 10 13]+0; 

そして、パッケージを送信するために:

function SendPackage(S, Package) 

for ii = 1:length(S) 
    fwrite(S(ii), Package); 
end 

は、どのように私は上記のMATLABコードで使用package変数を表現するC++の配列/ベクトルを作成することができますか?

私はMATLABに関する経験がないので、どんな助けでも大いに評価されるでしょう。

ありがとうございました!

+0

良いC++リファレンスは 'std :: vector'の使い方を示します。 –

+0

キーワード "C++ matlab array vector"をインターネットで検索すると、関連する例が表示されます。 –

+0

私の主な疑問は、そのベクトルはどのような型になるのだろうか...整数、char? – leandrocoutom

答えて

1

package変数がMATLABコードで符号なし8ビット整数としてストリームされているため、C++でchar[12]配列を使用します。お使いのプラットフォームでsizeof(char)をダブルチェックして、charが1バイトのみであることを確認できます。

はい、MATLABのデフォルトのデータ型はdoubleですが、ベクトルVが整数値で埋められているわけではありません。これを把握するには、このデータまたは機器の仕様を参照する必要があります。

どのような値が入力されていても、出力範囲を[-100,100]に設定/クリッピングして、それらをバイト範囲[0、255]にオフセットしています。

MATLABについてよくわからない場合は、C++の知っているものを活用してCを暫定的に使用することができます。 MATLABのfwrite機能はCの関数と並んでおり、これらの関数を#include<cstdio.h>プリプロセッサーディレクティブでC++に組み込むことができます。ここで

は例のソリューションです:

#include <cstdio.h> // fwrite 
#include <algorithm> // min, max 
... 

void makeAndSendPackage(int * a6x1array, FILE * fHandles, int numHandles){ 

    char packageBuffer[13] = {'B','D',24,0,0,0,0,0,0,'P','\n','\r',0}; 

    for(int i=0;i<6;i++){ 
     int tmp = a6x1array[i]; 
     packageBuffer[i+3] = tmp<0: abs(max(-100,tmp))+144 ? min(100,tmp)+16; 
    } 

    for(int i=0;i<6;i++){ 
     fwrite(fHandles[i],"%s",packageBuffer); 
    } 

} 

あなたは上記のコードについて質問があるなら、私に教えてください。

+1

ありがとうございます!シリアル通信は、あなたのおかげで、C++でうまくいった! (あなたは配列の 'P'を忘れていたが、それは問題なかった)。私の助けにあなたの時間を与えてくれてありがとう。 – leandrocoutom

+0

ああ、そうしました。私は完全にそれを修正します。あなたが働いてうれしいです。私はそれに答えるのに十分な情報があったので、なぜ質問がまだ保留になっているのか、それほど確かではありません。 – informaton

関連する問題