2017-12-14 16 views
0

Swift 3에서 코어 블루투스를 사용하면 CBPeripheral.writeValue()을 사용하여 Central에 특성을 쓰고, UISlider의 값이 변경되면이 작업을 수행합니다. 나는 슬라이더를 천천히 드래그 했더라도 때로는 중앙에서 값의 점프가 보일 것이라고 생각했습니다. 공중에서의 부패가 일어나고 있다고 생각했기 때문에 동일한 값을 세 번 쓰도록 특성을 변경했습니다. 이제 Central 매치에서받은 모든 값이 Central 매치에서 작동 할 때만 나타납니다. 현재 코드는 다음과 같습니다.BLE 특성 쓰기 값이 때때로 임의 값으로 점프

@IBAction func slideValChanged(_ sender: UISlider) 
{ 
    let sliderVal = UInt8(sender.value.rounded(FloatingPointRoundingRule.down)) 
    if (sliderVal != self.sliderVal) 
    { 
     self.sliderVal = sliderVal 
     self.bytes.removeAll() 
     self.bytes = [self.sliderVal, self.sliderVal, self.sliderVal] 
     DispatchQueue.global(qos: .userInitiated).async 
     { 
      self.data = Data(bytes: self.bytes) 
      self.peripheral.writeValue(self.data, for: self.writeCharacteristic!, type: CBCharacteristicWriteType.withResponse) 
      print("Write values sent:", self.bytes[0], self.bytes[1], self.bytes[2]) 
     } 
    } 
} 

그럼에도 불구하고, 나는 여전히 값 점프를 보지만 특별한 것은 없습니다. print() 문은 항상 동일한 (올바른) 번호를 세 번 인쇄합니다. 마찬가지로 Central에서 값이 점프 할 때 3 개의 동일하지만 잘못된 값을받습니다. 어떻게 이럴 수있어? 내가 생각할 수있는 것은 중핵 블루투스에있는 무엇인가 그것이 공중에 얹히 기 전에 가치를 바꾸고있다. 그러나 나는 확실하지 않다. 그리고 나는 나의주의를 어디에 초점을 맞출 지 모른다.

+0

아마도 'self.data' (분명히)에'Data' 유형이 있다면'self.data를 Data'로 쓰는 이유는 무엇입니까? –

+0

약간의 관계없는 코드. 나는 제거하고 재시험했다. 같은 문제. –

답변

0

CBCharacteristicWriteType.withResponse를 사용하면 슬라이더가 느리게 움직여도 많은 패킷이 전송됩니다. writeCharacteristic 명령에 쓸 때 writeCharacteristic을 다시 호출하기 전에 콜백을 기다려야합니다. 콜백은 데이터가 중앙 BLE 스택에 버퍼링되었고 스택이 추가 데이터를받을 준비가되었음을 나타냅니다. 이 정보가 없으면 데이터가 손상되거나 연결이 끊어 질 수 있습니다.