IOS Swift TI SensorTag2数据转换

标签 ios swift bluetooth

我使用 TI SensorTag2 为 iOS 编写了一个应用程序。现在我无法将通过蓝牙读取的数据转换为应用程序的 Float。

以下代码来自 TI 为 Objective C 应用程序发布的源代码。

-(NSString *) calcValue:(NSData *) value {

char vals[value.length];
[value getBytes:vals length:value.length];

Point3D gyroPoint;

gyroPoint.x = ((float)((int16_t)((vals[0] & 0xff) | (((int16_t)vals[1] << 8) & 0xff00)))/ (float) 32768) * 255 * 1;
gyroPoint.y = ((float)((int16_t)((vals[2] & 0xff) | (((int16_t)vals[3] << 8) & 0xff00)))/ (float) 32768) * 255 * 1;
gyroPoint.z = ((float)((int16_t)((vals[4] & 0xff) | (((int16_t)vals[5] << 8) & 0xff00)))/ (float) 32768) * 255 * 1;

self.gyro = gyroPoint;

Point3D accPoint;

accPoint.x = (((float)((int16_t)((vals[6] & 0xff) | (((int16_t)vals[7] << 8) & 0xff00)))/ (float) 32768) * 8) * 1;
accPoint.y = (((float)((int16_t)((vals[8] & 0xff) | (((int16_t)vals[9] << 8) & 0xff00))) / (float) 32768) * 8) * 1;
accPoint.z = (((float)((int16_t)((vals[10] & 0xff) | (((int16_t)vals[11] << 8) & 0xff00)))/ (float) 32768) * 8) * 1;

self.acc = accPoint;

Point3D magPoint;
magPoint.x = (((float)((int16_t)((vals[12] & 0xff) | (((int16_t)vals[13] << 8) & 0xff00))) / (float) 32768) * 4912);
magPoint.y = (((float)((int16_t)((vals[14] & 0xff) | (((int16_t)vals[15] << 8) & 0xff00))) / (float) 32768) * 4912);
magPoint.z = (((float)((int16_t)((vals[16] & 0xff) | (((int16_t)vals[17] << 8) & 0xff00))) / (float) 32768) * 4912);


self.mag = magPoint;


return [NSString stringWithFormat:@"ACC : X: %+6.1f, Y: %+6.1f, Z: %+6.1f\nMAG : X: %+6.1f, Y: %+6.1f, Z: %+6.1f\nGYR : X: %+6.1f, Y: %+6.1f, Z: %+6.1f",self.acc.x,self.acc.y,self.acc.z,self.mag.x,self.mag.y,self.mag.z,self.gyro.x,self.gyro.y,self.gyro.z];
}

当我尝试将此代码转换为 Swift 时,出现错误“整数文字‘65280’在存储到 Int16 时溢出

let xF: Float = ((Float((Int16(bytes[6]) & 0xff) | ((Int16(bytes[7]) << 8) & 0xff00)) / Float(32768)) * 8) * 1

据我所知,它将 2 个 Int8 变量组合成一个 Int16 并且它应该可以工作,我只是找不到我在哪里犯了错误。带有“& 0xff00”的部分已标记,当我理解正确时,这是在这里所以只有前 8 位包含 1,其余为 0

我让它与来自 SensorTag2 的 android 应用程序的代码一起工作,但是当我也从陀螺仪读取数据时,该代码有时会使应用程序崩溃,所以我想使用该 iOS 代码

let x = (Int16(bytes[7]) << 8) + Int16(bytes[6])
let xF = Float(x) / (32768.0 / 8.0)

也许这里有人可以指出正确的方向来解决我的问题

最佳答案

这一行中的一件坏事:

let xF: Float = ((Float((Int16(bytes[6]) & 0xff) | ((Int16(bytes[7]) << 8) & 0xff00)) / Float(32768)) * 8) * 1

这是:((Int16(bytes[7]) << 8) & 0xff00) .

你知道 Int16可以表示数字-32768...32767,0xff00 的值为 65280。正如错误消息所说,它对于 Int16 来说太大了。 .

(记住 Swift 不会对数字类型进行隐式转换。)

随着制作bytes作为未签名的:

let bytes = UnsafePointer<UInt8>(data.bytes)

您无需使用 & .

但是你需要传递一个带符号的值给Float.init ,所以你的代码需要是这样的:

let xF: Float = ((Float(Int16(bitPattern: UInt16(bytes[6]) | (UInt16(bytes[7]) << 8))) / Float(32768)) * 8) * 1

(否则,bytes 中的负值会使您的应用崩溃。)

关于IOS Swift TI SensorTag2数据转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38700873/

相关文章:

ios - 核心蓝牙无法发现外设

bluetooth - 当您信任蓝牙设备时,存储信任的配置文件在哪里?

ios - Swift 中第三方库和框架的通用实现

ios - 检测触摸是否在 Sprite 边界内,但忽略 child

ios - UIViewController swift 中的多个子 TableView Controller

ios - 如何在quickblox中实现发送图像(Swift、iOS、xcode)

objective-c - 使用 SenTestingKit/OCUnit 测试异常

ios - Objective-C 的调用图或控制流图(iOS 应用程序)

ios - 在后台检查服务器端应用程序通知,在 Swift 中

安卓蓝牙 : Convert ScanResult timestampNanos to System nanoTime