2017-08-07 5 views
-1

Dans mon projet, je suis responsable de la migration du code MATLAB vers C++. Le code ci-dessous fait référence à la communication série entre un ordinateur et un microcontrôleur. La fonction CreatePackage génère un package qui est ensuite envoyé au microcontrôleur à l'aide de la fonction fwrite (série) de MATLAB.Quel est l'équivalent C++ de ce code MATLAB?

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; 

Et puis, pour envoyer le paquet:

function SendPackage(S, Package) 

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

Comment puis-je créer un tableau/vecteur en C++ pour représenter la variable package utilisée dans le code ci-dessus Matlab? Je n'ai aucune expérience avec MATLAB donc toute aide serait grandement appréciée.

Merci!

+0

Une bonne référence C++ montrera comment utiliser 'std :: vector'. –

+0

Une recherche sur Internet pour les mots-clés "C++ matlab array vector" devrait montrer quelques exemples pertinents. –

+0

Mon principal doute est de savoir quel type serait ce vecteur ... integer, char? – leandrocoutom

Répondre

1

La variable package est diffusée en tant que 12 entiers non signés de 8 bits dans votre code MATLAB, donc j'utiliserais un tableau char[12] en C++. Vous pouvez revérifier sizeof(char) sur votre plate-forme pour vous assurer que char est seulement 1 octet.

Oui, le type de données MATLAB par défaut est double, mais cela ne signifie pas que votre vecteur V n'est pas rempli avec des valeurs entières. Vous devez regarder ces données ou les spécifications de votre équipement pour comprendre cela. Quelles que soient les valeurs entrées, vous définissez/découpez la plage de sortie sur [-100, 100], puis vous les décalez sur la plage d'octets [0, 255].

Si vous ne connaissez pas beaucoup MATLAB, vous pourrez peut-être tirer parti de ce que vous savez de C++ et utiliser C comme un intermédiaire. La fonctionnalité fwrite de MATLAB s'aligne avec celle de C, et vous pouvez inclure ces fonctions en C++ avec la directive du préprocesseur #include<cstdio.h>.

Voici un exemple de solution:

#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); 
    } 

} 

Laissez-moi savoir si vous avez des questions sur le code ci-dessus.

+1

Merci beaucoup! La communication série a fonctionné maintenant en C++ grâce à vous, bon travail! (Vous avez oublié le «P» dans le tableau mais c'était bien). Merci encore d'avoir donné votre temps pour m'aider. – leandrocoutom

+0

Ah, alors je l'ai fait. Je vais corriger cela pour l'exhaustivité. Content que tu aies travaillé. Je ne suis pas tout à fait sûr pourquoi la question est toujours en attente, car il y avait assez d'informations pour y répondre, mais qu'il en soit ainsi. – informaton