2017-08-07 3 views
-1

In meinem Projekt bin ich für die Migration von MATLAB-Code nach C++ verantwortlich. Der folgende Code bezieht sich auf die serielle Kommunikation von einem Computer zu einem Mikrocontroller. Die Funktion CreatePackage erzeugt ein Paket, das dann mit MATLABs fwrite (seriell) Funktion an den Mikrocontroller gesendet wird.Was entspricht das C++ diesem MATLAB-Code?

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; 

Und dann, um das Paket zu senden:

function SendPackage(S, Package) 

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

Wie kann ich ein Array/Vektor in C++ zu erstellen, die package Variable in dem obigen Code MATLAB verwendet zu vertreten?

Ich habe keine Erfahrung mit MATLAB, so würde jede Hilfe sehr geschätzt werden.

Vielen Dank!

+0

Eine gute C++ - Referenz zeigt, wie man 'std :: vector' verwendet. –

+0

Eine Suche im Internet nach Schlüsselwörtern "C++ Matlab Array Vector" sollte einige relevante Beispiele zeigen. –

+0

Mein Hauptzweifel ist, welcher Typ wäre dieser Vektor ... ganze Zahl, char? – leandrocoutom

Antwort

1

Die package Variable wird als 12, unsigned 8-Bit-Ganzzahlen in Ihrem MATLAB-Code gestreamt, so dass ich ein char[12] Array in C++ verwenden würde. Sie können sizeof(char) auf Ihrer Plattform überprüfen, um sicherzustellen, dass char nur 1 Byte ist.

Ja, der MATLAB-Standarddatentyp ist ein double, aber das bedeutet nicht, dass Ihr Vektor V nicht mit ganzzahligen Werten gefüllt ist. Sie müssen sich diese Daten oder die Spezifikationen von Ihrem Gerät ansehen, um das herauszufinden.

Unabhängig davon, welche Werte eingegeben werden, setzen/begrenzen Sie den ausgehenden Bereich auf [-100, 100] und setzen sie dann auf den Bytebereich [0, 255].

Wenn Sie nicht viel über MATLAB wissen, können Sie möglicherweise das nutzen, was Sie aus C++ wissen, und C als Zwischenversion verwenden. MATLABs fwrite-Funktionalität entspricht der von C, und Sie können diese Funktionen in C++ mit der Präprozessor-Direktive #include<cstdio.h> einfügen. Hier

ist ein Beispiel Lösung:

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

} 

Lassen Sie mich wissen, wenn Sie Fragen zu den obigen Code haben.

+1

Vielen Dank! Die serielle Kommunikation funktionierte jetzt in C++ dank dir, nette Arbeit! (Sie haben das 'P' im Array vergessen, aber das war in Ordnung). Nochmals vielen Dank, dass du dir die Zeit genommen hast, mir zu helfen. – leandrocoutom

+0

Ah, also tat ich es. Ich werde das für die Vollständigkeit beheben. Ich bin froh, dass du gearbeitet hast. Ich bin mir nicht ganz sicher, warum die Frage immer noch in der Warteschleife ist, denn es gab genügend Informationen, um darauf zu antworten, aber so sei es. – informaton

Verwandte Themen