将值打包和解压缩为位 Arduino-Matlab



我一直在阅读几个线程,但我仍然不确定如何完成此操作。我正在使用 analogRead(( 在 Arduino 中读取一些值,所以我得到 0-1023 之间的值,并通过串行通信将它们发送到 Matlab。我目前正在使用 Serial.print((,但我读到它是使用 Serial.write(( 的一种更有效的方法:首先将值打包成位,只发送 MSB 和 LSB。这样,我将使用比使用 Serial.print 更少的位来发送一个值。

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

嘟嘟,请你帮我一把?

提前致谢

首先在

Arduino 上的 C/C++ 中,您可以通过位移位和位掩码的按位操作获得最高有效位 (MSB( 或最低有效位 (LSB(:

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 端有等效的按位函数,只是不要指望它们像 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

最新更新