Arduino Nano 33 BLE蓝牙传值到树莓派 如何接收为数值类型
解决方案
问题核心原因
你当前拿到的{'rsp': ['wr']}是bluepy库中write()方法的正常返回值,代表写入特征值操作成功,并不是Arduino返回的业务数据。你的代码只实现了树莓派向Arduino写数据的逻辑,没有执行读取特征值或者监听BLE通知的操作,自然拿不到Arduino侧的数值,也完全不需要改用socket实现,BLE原生的特征值读写、通知机制足以满足需求。
代码修改方案
一、Arduino侧调整(按需选择)
如果只是需要树莓派主动读取当前特征值,你的现有代码已经满足BLERead权限要求,无需修改。如果需要Arduino主动向树莓派推送数值,可按如下调整特征值配置,增加通知权限:
// 将原来的BLEByteCharacteristic替换为以下配置,可根据传输数值的类型选择BLEIntCharacteristic、BLEFloatCharacteristic等 BLEByteCharacteristic switchCharacteristic("19B10001-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite | BLENotify);
后续需要推送数值时,直接调用switchCharacteristic.writeValue(你的数值)即可自动推送给已连接的树莓派。
二、树莓派Python侧调整
场景1:树莓派主动读取当前特征值
import bluepy.btle as btle p1 = btle.Peripheral("2D:20:48:59:8F:B4") # 直接用固定UUID查找服务和特征值,不要依赖索引,避免顺序变动导致取错对象 s1 = p1.getServiceByUUID("19B10000-E8F2-537E-4F6C-D104768A1214") c1 = s1.getCharacteristics("19B10001-E8F2-537E-4F6C-D104768A1214")[0] # 写入操作,返回的就是你之前看到的写成功响应 write_resp = c1.write(bytes([1])) print("写操作响应:", write_resp) # 读取特征值并转成数字 raw_value = c1.read() num_value = int.from_bytes(raw_value, byteorder='little', signed=False) print("读取到的数值:", num_value) p1.disconnect()
场景2:监听Arduino主动推送的数值
import bluepy.btle as btle # 通知回调函数,收到Arduino推送数据时自动触发 def handle_notification(handle, data): num_value = int.from_bytes(data, byteorder='little', signed=False) print(f"收到Arduino推送的数值:{num_value}") p1 = btle.Peripheral("2D:20:48:59:8F:B4") s1 = p1.getServiceByUUID("19B10000-E8F2-537E-4F6C-D104768A1214") c1 = s1.getCharacteristics("19B10001-E8F2-537E-4F6C-D104768A1214")[0] # 绑定通知回调 p1.setDelegate( type('MyDelegate', (btle.DefaultDelegate,), {'handleNotification': handle_notification})() ) # 开启特征值通知 ccc_desc = c1.getDescriptors(forUUID=0x2902)[0] ccc_desc.write(b'\x01\x00') # 循环监听通知 while True: p1.waitForNotifications(1.0)
注意事项
- 数值传输直接使用字节类型,不要转成字符串编码,可降低解析成本
- 大小端配置根据你Arduino侧写入的数值规则调整即可,默认嵌入式设备一般用小端
内容的提问来源于stack exchange,提问作者jonghun lim
相关产品推荐
相关产品推荐

