Swift Sensortag 2.0 将位写入 BLE

Swift Sensortag 2.0 Write Bits to BLE

这里是非常基本的问题:

我目前正在尝试通过 Swift 3.0 控制 sensortag 2.0。

我正在尝试同时打开加速器、陀螺仪和磁力计。

根据 Texas Instruments 文档,以下内容适用于 IMU:

轴启用bits:gyro-z=0,gyro-y,gyro-x,acc-z=3,acc-y,acc-x,mag=6 范围:位8,9

我按照下面的方式写了“0x023F”,成功地打开了陀螺仪和加速度计。

                let value = OperationDataHolder(data:[0x023F])
                var parameter = 0x023F
                let data = NSData(bytes: &parameter, length: 2)
                self.sensorTagPeripheral.writeValue(data as Data, for: thisCharacteristic, type: CBCharacteristicWriteType.withResponse)

但是,我无法计算出要写入的值以同时打开所有 3 个单元。有人能给我这个值吗?

谢谢!

当您将当前使用的值 (0x023F) 转换为二进制时,您将得到 0b1000111111。每个位代表给定传感器组件的 on/off (on=1/off=0) 状态。

如果你从从右到左读取二进制数,并通过参考下面的table映射每一位,你会看到陀螺仪z/y/x 和加速度计 z/y/x 都已启用。如果要启用磁力计,只需将 'bit 6' 更改为“1”并将该二进制数转换为十六进制数即可。

所以,Google 说:0b1001111111 是十六进制的 0x027F

映射:
位 0 => 陀螺仪 z 轴
位 1 => 陀螺仪 y 轴
位 2 => 陀螺仪 x 轴
位 3 => acc z 轴
位 4 => acc y 轴
位 5 => acc x 轴
bit 6 => mag(启用所有轴)
位 7 => 运动唤醒启用
位 8 和 9 => 加速度计范围
位 10-15 => 未使用

有关映射的更多信息(即第 8 位和第 9 位的作用),请参阅 Sensor Tag Wiki Page

基于彼得的回答,swifty 方法是使用一个选项集,诚然这需要更多的前期工作,但比十六进制更具可读性:

    struct SensorOptions: OptionSet {
        let rawValue: Int32
        static let gyroZ = SensorOptions(rawValue: 1 << 0)
        static let gyroY = SensorOptions(rawValue: 1 << 1)
        static let gyroX = SensorOptions(rawValue: 1 << 2)
        static let accZ  = SensorOptions(rawValue: 1 << 3)
        static let accY  = SensorOptions(rawValue: 1 << 4)
        static let accX  = SensorOptions(rawValue: 1 << 5)
        static let mag   = SensorOptions(rawValue: 1 << 6)
        static let wakeOnMotion = SensorOptions(rawValue: 1 << 7)
        static let accelerometerRange1 = SensorOptions(rawValue: 1 << 8)
        static let accelerometerRange2 = SensorOptions(rawValue: 1 << 9)
    }

    let options: SensorOptions = [.gyroZ, .gyroY, .gyroX, .accZ, .accY, .accX, .mag, .accelerometerRange2]
    var parameter = options.rawValue
    let data = NSData(bytes: &parameter, length: 2)
    self.sensorTagPeripheral.writeValue(data as Data, for: thisCharacteristic, type: CBCharacteristicWriteType.withResponse)

此外,如果您不喜欢选项集 swift 具有二进制文字,因此您可以在代码中编写 var parameter = 0b1001111111 而不是 0x027F