我很难获得所需的正确价值。 我从我的特色词汇中得到:
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor ...
我可以通过以下方式阅读和打印这些值:
let values = characteristic.value
for val in values! {
print("Value", num)
}
这让我:
"Value 0" // probe state not important
"Value 46" // temp
"Value 2" // see below
问题是temp不是46。 下面是我需要如何转换字节以获取实际温度的指令片段。 实际温度约为558ºF。 以下是说明的一部分:
Description: temperature data that is valid only if the temperature stat is normal
byte[1] = (unsigned char)temp;
byte[2] = (unsigned char)(temp>>8);
byte[3] = (unsigned char)(temp>>16);
byte[4] = (unsigned char)(temp>>24);
我似乎无法获得正确的温度?请让我知道我做错了什么。
答案 0 :(得分:2)
说明书告诉你答案。您在字节1中获得46
,然后在字节2中获得2
。指令说单独留下字节1,但对于字节2,我们将结果移至temp>>8
- 这意味着"乘以256
" (因为2^8
是256
)。 <嗯,什么是
46+256×2
它是558
,只是我们正在寻找的结果。
答案 1 :(得分:2)
根据描述,value[1]
... value[4]
对于(32位整数)温度的最高有效字节最不重要,所以这就是你重新创建的方式
来自字节的值:
if let value = characteristic.value, value.count >= 5 {
let tmp = UInt32(value[1]) + UInt32(value[2]) << 8 + UInt32(value[3]) << 16 + UInt32(value[4]) << 24
let temperature = Int32(bitPattern: tmp)
}
bit-fiddling是用无符号整数运算来避免的 溢出。假设温度是签名的值, 然后将此值转换为具有相同的有符号整数 位表示。