및 데이터 변환, 그러나 나는 값의 범위 내가 characteristic.value
를받을 BLE에서스위프트 - 소수 값 I 소수점 값으로 변환 할
잘못된 것으로 보인다 때문에 내가 뭔가 잘못을 의심
IMU는 maily 값을 생성한다24ffa400 6d08fcff fffffbff 0d001500 5eff
.
가속도계 X 축 값인 24ff
의 첫 번째 두 바이트를 변환하려고하면 1000-30000 범위의 값을 얻습니다. (센서에 동적 인 움직임을 도입하여 값이 어떻게 변하는 지 알았습니다.).
±16G
가 두 개 더 중요한 정보가있다라고 말할 때문에 잘못해야합니다 : [LSB, MSB]
값은 다음과 같습니다 프레임이 간다에서 다음과 같이 바이트
순서
: 16 비트 및 활용 2의 보수는
이 내가 소수점 값으로 데이터를 변환하는 방법입니다
class func getAccelerometerData(value: NSData) -> [String] {
let dataFromSensor = dataToSignedBytes8(value)
let bytes:[Int8] = [dataFromSensor[1], dataFromSensor[0]]
let u16 = UnsafePointer<Int16>(bytes).memory
return([twosComplement(u16)])
}
class func twosComplement(num:Int16) -> String {
var numm:UInt16 = 0
if num < 0 {
let a = Int(UInt16.max) + Int(num) + 1
numm = UInt16(a)
}
else { return String(num, radix:10) }
return String(numm, radix:10)
}
위에서 언급 한 거대한 값 대신 범위 < -16 : 16> 값을 얻어야한다고 가정합니다. 내 접근 방식에 어떤 문제가 있습니까? 사전에
감사
편집 : 일부 NSData
을 감안할 때 누락 메소드 구현
class func dataToSignedBytes8(value : NSData) -> [Int8] {
let count = value.length
var array = [Int8](count: count, repeatedValue: 0)
value.getBytes(&array, length:count * sizeof(Int8))
return array
}
그래서 twoComplement 함수를 생략 할 수 있습니까? 또한 LSB 및 MSB 주문에주의해야합니까? 가 지금은 STH getAccelerometerData FUNC이'클래스를 좋아 한 (값 :있는 NSData) -> 더블 { 할 dataFromSensor = dataToSignedBytes8 (값) 바이트를하자 : [INT8를] = [dataFromSensor [0], dataFromSensor [1]] let i16 = UnsafePointer (바이트) .memory return (16.0 * Double (i16)/32768).0)' 이 작동하는 것 같습니다. 코드를 확인할 수 있습니까? –
DCDC
@DCDC : 귀하의 데이터 인 TosignedBytes8이 무엇인지 모릅니다. 불필요한 것으로 보입니다. 시연 한대로 직접 데이터에 액세스 할 수 있습니다. 그렇지 않으면 올바른 것으로 보입니다. 'Int16'은 리틀 엔디안 메모리 표현을 사용한다고 가정합니다. 이것은 현재 모든 iOS 장치의 경우입니다. –
@DCDC : 바이트 순서 안전을 위해 코드를 업데이트했습니다! –