2016-08-18 10 views
6

मैं BLE के माध्यम से डेटा हो रही है और मैं उन्हें दशमलव मान में कनवर्ट करना चाहते हैं के लिए डेटा परिवर्तित, फिर भी मैं क्योंकि मूल्य रेंज गलत BLE सेस्विफ्ट - दशमलव मान

मैं characteristic.value प्राप्त प्रकट होता है मैं कुछ गलत करते हैं संदेह

24ffa400 6d08fcff fffffbff 0d001500 5eff

जो IMU मूल्यों की maily निर्माण किया है।

जब मैं, पहले दो बाइट्स कन्वर्ट करने के लिए इस उदाहरण 24ff जो है accelerometer एक्स अक्ष मूल्य में की कोशिश, मैं सीमा 1,000-30,000 से एक मूल्य मिलता है (मैं सेंसर करने के लिए कुछ गतिशील आंदोलन की शुरुआत की है देखने के लिए कैसे मूल्य बदल रहा है)।

के बाद से किए गए दस्तावेज़ों का कहना है कि accelerometer पैमाने पर है कि ±16G दो और महत्वपूर्ण जानकारी कर रहे हैं यह गलत होना चाहिए: इस प्रकार

बाइट्स के अनुक्रम फ्रेम चला जाता है में: [LSB, MSB]

मान हैं 16bit और इस्तेमाल दो के पूरक

यह है कि कैसे मैं दशमलव मान में डेटा परिवर्तित:

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> से मूल्य प्राप्त करना चाहिए, मेरे दृष्टिकोण में क्या गलत है?

अग्रिम धन्यवाद

संपादित करें: गुम विधि कार्यान्वयन

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

कुछ NSData को देखते हुए,

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 

scaled एक Double है और एक स्ट्रिंग में बदला जा सकता String(scaled) के साथ, या NSNumberFormatter का उपयोग कर।

+0

तो क्या मैं दो पूरक फ़ंक्शन को छोड़ सकता हूं? मुझे एलएसबी और एमएसबी आदेश पर भी ध्यान देना चाहिए? अब मैं sth getAccelerometerData समारोह इस 'वर्ग की तरह है (मूल्य: NSData) -> डबल { जाने dataFromSensor = dataToSignedBytes8 (मान) बाइट्स करते हैं: [Int8] = [dataFromSensor [0], dataFromSensor [1]] i16 = UnsafePointer (बाइट्स)। मेमरी वापसी (16.0 * डबल (i16)/32768।0) ' और काम कर रहा प्रतीत होता है, क्या आप कोड को सत्यापित कर सकते हैं? – DCDC

+0

@ डीसीडीसी: मुझे नहीं पता कि आपका डेटा क्या है, हस्ताक्षर किए गएबेट्स 8, जो अनावश्यक लगता है, आप सीधे डेटा तक पहुंच सकते हैं जैसा मैंने प्रदर्शित किया था। अन्यथा यह सही दिखता है। यह मानता है कि 'Int16' एक छोटे-अंत स्मृति स्मृति का उपयोग करता है, जो कि सभी मौजूदा आईओएस उपकरणों के मामले में है। –

+0

@ डीसीडीसी: मैंने इसे बाइट-ऑर्डर सुरक्षित बनाने के लिए कोड अपडेट किया है! –

संबंधित मुद्दे