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: ¶meter, 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: ¶meter, length: 2)
self.sensorTagPeripheral.writeValue(data as Data, for: thisCharacteristic, type: CBCharacteristicWriteType.withResponse)
此外,如果您不喜欢选项集 swift 具有二进制文字,因此您可以在代码中编写 var parameter = 0b1001111111 而不是 0x027F
这里是非常基本的问题:
我目前正在尝试通过 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: ¶meter, 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: ¶meter, length: 2)
self.sensorTagPeripheral.writeValue(data as Data, for: thisCharacteristic, type: CBCharacteristicWriteType.withResponse)
此外,如果您不喜欢选项集 swift 具有二进制文字,因此您可以在代码中编写 var parameter = 0b1001111111 而不是 0x027F