我正在使用Ionic及其蓝牙串行插件构建蓝牙应用程序,该插件根据this方案从心率监视器读取3个字节。
[plugin]将数据作为ArrayBuffer返回,其中包含一个分布在两个字节上的10位整数。我不确定如何提取这些10位并将它们转换为整数,有人可以帮助我吗?
编辑: 这是pdf中的数据结构:
在实时或模拟模式下,BITalino(r)演进固件会对采集的数据进行流式处理 实时地,格式化为对应于以下的结构化位序列:
CRC:4位循环冗余校验(CRC)代码,用于评估数据 接收器上的数据包一致性。
S:固件生成的4位序列号,用于识别数据包,即可 用于接收器以检测丢包。
O1& O2:数字输出端口O1&的状态。设备上的O2。
I1& I2:数字输入端口I1&的状态。 I2在设备上。
A1-A6:ADC产生的数字代码,用于相应模拟输入的电压 港口A1-A6;前四个通道以10位分辨率(范围从0-1023)到达 最后两个以6位到达(范围从0到63)
图表: Bits diagram
干杯,
贾里德
答案 0 :(得分:0)
如果我正确读取该图表,则数据为字节[1]的低4位与字节[0]的高6位相结合;
// (buffer[1] - 0) & 0x0f) // get the 4 bits from byte 1
// (((buffer[0] - 0) & 0xfc) << 2) // get the 6 bits from byte 0 and shift over twice
result = ((buffer[1] - 0) & 0x0f) + ( ((buffer[0] - 0) & 0xfc) << 2 )
你有一个字节缓冲区看起来喜欢的样本吗?
那么,为了更好地理解0x内容,我们需要更详细地查看图表。
前4位在字节1上,特别是在0-3位。 0-3位是1 + 2 + 4 + 8 = 15或0x0f。我可以说(缓冲区[1] - 0)&amp; 15),但使用十六进制表示法0x0f看起来更干净,有点镜像数据。
对于字节0中的数据,它来自位2-7,它们加在一起等于252或0xfc。现在这个数据的问题是它从第2位开始,第1字节的数据在第3位结束。我们需要移位这些位,因此它们从第4位开始并且没有任何重叠。随着位移位,我们可以将两个数字相加并得到组合数。
如果你需要知道,我会在整个地方减去0,因为这会强制JavaScript将操作视为数字,而不是尝试执行字符串数学。
答案 1 :(得分:0)
我想你想使用read
函数然后你应该做@Michael Fuller指出的事情。我会这样写(编辑):
let array = new Int8Array(3);
bluetoothSerial.read(function(data) {
array[0] = (data >> 16) & 0xff;
array[1] = (data >> 8) & 0xff;
array[2] = data & 0xff;
});
var bits6 = parseInt(array[0] & 0xfc);
bits6 <<= 2;
//0xfc=1111 1100, 0x0f=0000 1111
var decodedInteger = bits6 + parseInt(array[1] & 0x0f);