将值打包并拆分为Arduino-Matlab

时间:2014-12-17 11:30:28

标签: matlab arduino

我一直在阅读几个主题,但我仍然不确定如何实现这一目标。我正在使用analogRead()读取Arduino中的一些值,所以我得到的值在0-1023之间,我通过Serial Communiaction将它们发送到Matlab。我目前正在使用Serial.print(),但我已经读过它是一种使用Serial.write()的更有效的方法:首先将值打包成位,然后只发送MSB和LSB。这样我将使用较少的位来发送一个值,而不是使用Serial.print。

问题是我不知道如何在Arduino中打包值(0-1023)以发送MSB和LSB,然后在MATLAB中解压缩它们以再次定义整数值。

请你帮我个忙吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

首先在Arduino上的C / C ++中,您可以通过bitwise operationsbit shiftingbit masking得到最高有效位(MSB)或最低有效位(LSB):< / p>

const word Value = 1000;   // Could also be an int or an unsigned int, [0-1023]
byte MSB = Value >> 8;     // Right shift
byte LSB = Value & 0x00FF; // Mask

但是,作为Arduino的Arduino具有以下功能:highBytelowByte分别返回值的MSB和LSB。

我无法确定使用Serial.Write对你来说会更快。如果您要向Matlab发送大量数据,最好将调用次数限制为Serial.WriteSerial.Print。您可以通过创建一个缓冲区(一个字节数组),将所有数据粘贴到其中,然后将上部传递给Serial.Write来实现此目的(请参阅此函数的重载版本的文档)。

在Matlab方面,有等价的bitwise functions,只是不要指望它们与它们的C对应物一样有效。它们对于测试原型非常有用。例如,您可以在Matlab中使用以下内容重现上述C代码:

Value = uint16(1000);
MSB = bitshift(Value,-8); % Right shift
LSB = bitand(Value,255);  % Mask

通过反转按位操作“重新组合”您的双字节值:

Value = bitor(bitshift(MSB,8),LSB)

在C中,这只是(MSB<<8)|LSB,您可以在Matlab中更有效地实现上述内容:

Value = MSB*256+LSB