2017-08-07 97 views
-1

在我的項目中,我負責將一些MATLAB代碼遷移到C++。下面的代碼是指從計算機到微控制器的串行通信。函數CreatePackage生成一個包,然後使用MATLAB的fwrite(serial)函數將其發送到微控制器。什麼是C++等價於這個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; 

然後,發送包:

function SendPackage(S, Package) 

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

如何創建在C++的陣列/矢量來表示在上面的MATLAB代碼中使用的變量package

我沒有使用MATLAB的經驗,所以任何幫助都會大大降低。

謝謝!

+0

一個好的C++參考將展示如何使用'std :: vector'。 –

+0

關鍵詞「C++ matlab array vector」的搜索應該顯示一些相關的例子。 –

+0

我的主要疑問是該類型的矢量是什麼類型......整數,字符? – leandrocoutom

回答

1

package變量正在流式傳輸爲12位無符號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

相關問題