2016-08-18 4 views
6
내가 BLE를 통해 데이터를 받고 있어요

및 데이터 변환, 그러나 나는 값의 범위 내가 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 
} 

답변

2

,

let value = NSData(bytes: [0x24, 0xff, 0xa4, 0x00] as [UInt8], length: 4) 
print(value) // <24ffa400> 

당신은 [LSB, MSB] 순서의 처음 두 바이트를 검색 할 수 있습니다 부호가있는 16 비트 정수로

let i16 = Int16(littleEndian: UnsafePointer<Int16>(data.bytes).memory) 
print(i16) // -220 

이 번호는 예를 들어, 범위 -32768 .. 32767이고 장치의 사양에 따라, 부동 소수점 범위로 확장해야

let scaled = 16.0 * Double(i16)/32768.0 
print(scaled) // -0.107421875 

scaledDouble이며 문자열로 변환 할 수있다 String(scaled) 또는 NSNumberFormatter을 사용하십시오.

+0

그래서 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

+0

@DCDC : 귀하의 데이터 인 TosignedBytes8이 무엇인지 모릅니다. 불필요한 것으로 보입니다. 시연 한대로 직접 데이터에 액세스 할 수 있습니다. 그렇지 않으면 올바른 것으로 보입니다. 'Int16'은 리틀 엔디안 메모리 표현을 사용한다고 가정합니다. 이것은 현재 모든 iOS 장치의 경우입니다. –

+0

@DCDC : 바이트 순서 안전을 위해 코드를 업데이트했습니다! –