NRF52840 和电脑 进行蓝牙通信

需求

以nrf52840为主控连接各种传感器,将传感器的数据通过蓝牙传输到电脑进行接收。由于协议栈的不同,hc-06没法检索到nrf52840。

实际配置

  1. 主控采用的是Seeed XIAO BLE,他的芯片是nrf52840,上面搭载了arduino的底子,所以用户上层用arduino IDE进行烧写代码。
  • 他的蓝牙部分采用的是Adafruit相关库。
  1. PC部分通过实践采用的是Adafruit_CircuitPython_BLE的库,所以在linux中运行,暂时不能在windows中。
  • OS:Ubuntu 20.04

实现过程

安装库

我的python版本是ubuntu自带的3.8

pip3 install adafruit-circuitpython-ble

如果需要在虚拟环境中安装,则

mkdir project-name && cd project-name
python3 -m venv .venv
source .venv/bin/activate
pip3 install adafruit-circuitpython-ble

测试

from adafruit_ble import BLERadio

radio = BLERadio()
print("scanning")
found = set()
for entry in radio.start_scan(timeout=60, minimum_rssi=-80):
    addr = entry.address
    if addr not in found:
        print(entry)
    found.add(addr)

print("scan done")

官方库:Adafruit_CircuitPython_BLE

搜索蓝牙并连接

上面的demo是检索蓝牙的部分,通过测试我们可以轻松检索到nrf52840的蓝牙。然后进行连接:

radio.connect(entry)

搜索到了 就停止搜索

radio.stop_scan()

数据传输

ntypes 是传输数据的个数,最多默认是64,可以自己在下载的数据包中的UARTService类修改它的buffer容量。
读取数据一共有三个函数可以使用:

def read(self, nbytes: Optional[int] = None) -> Optional[bytes]
def readinto(self, buf: WriteableBuffer, nbytes: Optional[int] = None) -> Optional[int]
def readline(self) -> Optional[bytes]

书写数据可以:

def write(self, buf: ReadableBuffer) -> None

举个例子

data = device[UARTService].read(ntypes)
message = data.decode()

具体案例可以参我的github的代码

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
nrf52832可以通过UART和电脑进行蓝牙通信。具体步骤如下: 1. 配置UART 在nrf52832上配置一个UART接口,使其可以通过串口与电脑通信。你可以使用nrfx库或者SDK自带的UART库来实现。下面是使用nrfx库的示例代码: ```c #define UART_TX_PIN 6 #define UART_RX_PIN 8 #define UART_BAUDRATE NRF_UART_BAUDRATE_115200 nrfx_uart_t uart_instance = NRFX_UART_INSTANCE(0); void uart_init(void) { nrfx_uart_config_t uart_config = NRFX_UART_DEFAULT_CONFIG; uart_config.baudrate = UART_BAUDRATE; uart_config.pselrxd = UART_RX_PIN; uart_config.pseltxd = UART_TX_PIN; nrfx_uart_init(&uart_instance, &uart_config, NULL); nrfx_uart_rx_enable(&uart_instance); } ``` 2. 配置蓝牙nrf52832上配置一个蓝牙连接,使其可以与电脑蓝牙进行通信。你可以使用nrfx库或者SDK自带的蓝牙库来实现。下面是使用SDK自带的蓝牙库的示例代码: ```c #define DEVICE_NAME "Nordic_UART" #define APP_BLE_OBSERVER_PRIO 3 #define APP_ADV_INTERVAL 64 #define APP_ADV_TIMEOUT_IN_SECONDS 180 static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context) { switch (p_ble_evt->header.evt_id) { case BLE_GAP_EVT_CONNECTED: break; case BLE_GAP_EVT_DISCONNECTED: break; case BLE_GAP_EVT_PHY_UPDATE_REQUEST: { ble_gap_phys_t phys = { .rx_phys = BLE_GAP_PHY_AUTO, .tx_phys = BLE_GAP_PHY_AUTO, }; sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys); } break; default: break; } } void ble_init(void) { uint32_t err_code; ble_stack_init(); gap_params_init(); gatt_init(); services_init(); advertising_init(); conn_params_init(); err_code = sd_ble_gap_tx_power_set(BLE_GAP_TX_POWER_ROLE_ADV, 0, TX_POWER); // 设置广播功率 APP_ERROR_CHECK(err_code); err_code = sd_ble_gap_adv_start(m_adv_handle, APP_BLE_CONN_CFG_TAG); APP_ERROR_CHECK(err_code); ble_advertising_start(BLE_ADV_MODE_FAST); NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL); } ``` 3. 通过UART发送和接收数据 当蓝牙连接成功后,你可以通过UART向电脑发送数据,也可以通过UART接收电脑发送的数据。下面是使用nrfx库的示例代码: ```c void uart_send_data(uint8_t * data, size_t length) { nrfx_uart_tx(&uart_instance, data, length); } void uart_receive_data(uint8_t * data, size_t length) { nrfx_uart_rx(&uart_instance, data, length); } ``` 你也可以使用SDK自带的UART库来实现UART的发送和接收。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值