2017-08-07 99 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

相关问题