首页 文章

将值打包并拆分为Arduino-Matlab

提问于
浏览
1

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

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

Coud你能帮个忙吗?

提前致谢

1 回答

  • 0

    首先在Arduino上的C / C中,您可以通过bit shiftingbit maskingbitwise operations获得最高有效位(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 对你来说会更快 . 如果您're sending lots of data to Matlab, it'最好将呼叫数量限制为 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
    

相关问题