如何从iPhone 7向PSoC BLE外设写入布尔值(BLE新手求助)
嘿,作为BLE新手能走到接收数据这一步已经很棒啦!针对你要做的开关按钮回传状态需求,核心是用到CoreBluetooth里的特征值写入相关的代理方法,我给你一步步理清楚:
核心流程与关键代理方法
首先你要明确:iOS端给BLE设备发数据,本质是向设备上某个**可写的特征值(CBCharacteristic)**写入数据,而确认写入结果的关键代理方法是CBPeripheralDelegate里的peripheral(_:didWriteValueFor:error:)。
第一步:处理按钮点击事件
先给你的UIButton绑定点击事件,在事件里把开关状态转换成BLE能传输的Data格式,然后调用写入方法:
// 假设你已经保存了连接好的PSoC外设对象(connectedPeripheral: CBPeripheral?) // 以及提前发现的可写特征值(writableCharacteristic: CBCharacteristic?) @IBAction func toggleSwitchButtonTapped(_ sender: UIButton) { // 切换按钮的选中状态,用来直观显示开关状态 sender.isSelected.toggle() // 把开关状态转成UInt8(0=关,1=开),也可以根据PSoC需求转成UInt32 let switchState: UInt8 = sender.isSelected ? 1 : 0 guard let sendData = Data(bytes: &switchState, count: MemoryLayout<UInt8>.size), let targetChar = self.writableCharacteristic else { print("数据准备失败或未找到可写特征值") return } // 发送数据:这里的写入类型选.withResponse会触发后续的代理回调确认结果 self.connectedPeripheral?.writeValue(sendData, for: targetChar, type: .withResponse) }
第二步:实现写入结果的代理方法
这个方法是用来确认数据是否成功发送到PSoC的,必须实现CBPeripheralDelegate协议才能拿到回调:
extension YourViewController: CBPeripheralDelegate { func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) { if let writeError = error { print("开关状态发送失败:\(writeError.localizedDescription)") // 这里可以加个Toast提示用户,或者做重试逻辑 return } print("开关状态已成功发送给PSoC!") // 可以在这里更新UI状态,比如给按钮加个成功动画之类的 } }
几个重要注意点
- 一定要确保你已经成功连接到PSoC设备,并且通过
peripheral(_:didDiscoverCharacteristicsFor:error:)代理方法找到了对应的可写特征值,把它保存到全局属性里(就是上面代码里的writableCharacteristic)。 - 写入类型的选择:
.withResponse需要PSoC返回确认,所以能拿到回调;.withoutResponse是无确认发送,速度更快但不保证送达,如果你不需要确认状态可以用这个。 - 数据格式:开关状态用UInt8就足够了,如果你之前接收的是UInt32,也可以把0/1转成UInt32再生成Data,比如
let switchState: UInt32 = sender.isSelected ? 1 : 0,生成Data的方式一样。
内容的提问来源于stack exchange,提问作者Anthony_b
相关产品推荐
相关产品推荐

