pc-ble-driver开发入门

(1)简介

pc-ble-driver是Nordic提供的一套开源的上位机BLE 开发软件库,配合nrf52832开发板,可以在上位机实现BLE中央设备和外设的功能。

上位机与硬件板之间通过UART通信,通信协议类似于蓝牙的HCI。在硬件设备中,运行基于softdevice的connectivity程序,与上位机的UART进行交互。

架构如下图所示:

pc-ble-driver提供C/C++、Python和Node.js三种源码库,托管在github网站上:

本文以C/C++语言为例,介绍pc-ble-driver的使用。

(2)准备工作

必要的工具包括:

工具 版本
nRF52开发板 PCA10040
SDK 14.x
pc-ble-driver 3
boost >1.54 (no 1.66.0)
cmake 3.11.0
Visual Studio 2017 or 2015

pc-ble-driver提供两个版本:v2和v3。v2版本支持nRF52和nRF51,v3版本仅支持nRF52。本文使用v3版本,相应的使用nRF52的开发板PCA10040。

Boost是一个C++通用软件库,为pc-ble-driver库提供了基础函数。pc-ble-driver要求Boost库版本要高于1.54。在测试发现1.66.0版本有一点问题,本文使用1.64.0版本。

cmake是一个生成VC++工程文件的工具,它可以与Boost配合,生成Visual C++工程文件(*.vcxjproj)。cmake\Modules\FindBoost.cmake文件中定义了cmake可以识别的Boost库版本范围,比如cmake 3.11可以识别Boost 1.70,而早期的cmake 3.9则最高仅能识别到Boost 1.65。所以推荐使用最新版的cmake。

Visual Studio 2017可以自定义安装组件以减小安装体积,以下为最小配置:

也可以使用命令行工具msbuild 2015msbuild 2017代替Visual Studio IDE,这样仍然能够编译cmake所生成的Visual C++工程,只是没有IDE功能。

上述软件安装后,需要添加环境变量:

  • C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin
  • C:\Program Files\CMake\bin

为了验证环境变量有效性,可以在cmd窗口中运行以下命令:

> where msbuild
> where cmake

正确情况下,能够打印出相关路径信息。

(3)编译Boost

将boost v1.64.0源码放到C:\root\boost\1.64.0。

在环境变量中加入 BOOST_ROOT=C:\root\boost\1.64.0,在cmd中执行echo %BOOST_ROOT%,应该能够输出路径。

前面已经安装好了Visual Studio 2017,在开始菜单可以看到几个快捷方式,如下:

快捷方式 说明
x64 Native Tools Command Prompt for VS 2017 本机和目标机器都是x64
x64_x86 Cross Tools Command Prompt for VS 2017 本机是x64,目标机器是x86
x86 Native Tools Command Prompt for VS 2017 本机和目标机器都是x86
x86_x64 Cross Tools Command Prompt for VS 2017 本机是x86,目标机器是x64

我们希望生成x86的应用程序,于是选择x86 Native Tools Command Prompt for VS 2017,打开它:

注意,这里不要使用系统的cmd窗口,会提示找不到cl.exe或者其他错误,使用这几个快捷方式,则会在启动时自动配置。

如果希望生成x64应用程序,则应该选择x86_x64 Cross Tools Command Prompt for VS 2017或x64 Native Tools Command Prompt for VS 2017。

然后依次执行以下命令:

> cd %BOOST_ROOT%
> ./bootstrap.bat
> ./b2 toolset=msvc-14.1 address-model=32 link=static --with-thread --with-system --with-regex --with-date_time --with-chrono

如果是Visual Studio 2017,对应着toolset=msvc-14.1,如果是Visual Studio 2015,对应着toolset=msvc-14.0。address-model=32/64分别对应着x86和x64,这跟上面选择的快捷方式要对应一致。link=static表示生成静态链接库。–with-xxx表示将生成thread、system、regex、date_time和chrono这几个库文件。

编译完毕后的提示如下:

同时会在.\stage\lib目录下生成十个库文件:

  • libboost_chrono-vc141-mt-1_64.lib
  • libboost_chrono-vc141-mt-gd-1_64.lib
  • libboost_date_time-vc141-mt-1_64.lib
  • libboost_date_time-vc141-mt-gd-1_64.lib
  • libboost_regex-vc141-mt-1_64.lib
  • libboost_regex-vc141-mt-gd-1_64.lib
  • libboost_system-vc141-mt-1_64.lib
  • libboost_system-vc141-mt-gd-1_64.lib
  • libboost_thread-vc141-mt-1_64.lib
  • libboost_thread-vc141-mt-gd-1_64.lib

编译pc-ble-driver的api库时会使用到这些文件。

(4)编译pc-ble-driver库

将pc-ble-driver源码放到C:\nordic\pc-ble-driver\3.0.1。

打开一个cmd,并依次执行以下命令:

> cd <pc-ble-driver dir>
> mkdir build & cd build
> cmake -G "Visual Studio 15 2017" ..
> msbuild ALL_BUILD.vcxproj

编译完毕后给出提示信息:

同时在.\build\Debug目录下生成一系列库文件:

  • pc_ble_driver_shared_sd_api_v2.dll
  • pc_ble_driver_shared_sd_api_v2.lib
  • pc_ble_driver_shared_sd_api_v5.dll
  • pc_ble_driver_shared_sd_api_v5.lib
  • pc_ble_driver_static_sd_api_v2.lib
  • pc_ble_driver_static_sd_api_v5.lib

在后续工程中,会用到这些库文件。实际上只会用到pc_ble_driver_static_sd_api_v5.lib这一个。

注意到,在.\build\Debug目录下有个test_uart.exe文件,在cmd窗口中运行它,看到如下输出表明正常:

在某些情况下,运行test_uart.exe可能没有任何输出,通常是因为系统缺少ucrtbased.dll,可以从系统路径(C:\Program Files (x86)\Windows Kits\10\bin\x64\ucrt\ucrtbased.dll)中复制一份放在exe所在目录。

默认情况下,cmake是采用x86架构,如果要使用x64需要显式声明。即如果上个步骤中生成的是x64的Boost库,这里的cmake命令行变成:

cmake -G "Visual Studio 15 2017 Win64" .. -T host=x64

如果架构不一致,将无法正确读取到Boost库。

 

至此,开发环境准备完毕。

(5)测试示例程序

打开cmd窗口,并依次执行下列命令:

> cd <pc-ble-driver dir>\examples\heart_rate_monitor
> mkdir build & cd build
> cmake -G "Visual Studio 15 2017" ..

成功后看到如下提示:

此时在build目录下将生成Project.sln等文件,可以使用Visual Studio 2017打开和编译它,如下:

也可以使用msbuild进行编译:

> msbuild ALL_BUILD.vcxproj

编译完毕,将在build\Debug目录下生成hrm_v5.exe。下面我们运行测试这个hrm_v5.exe。

准备PCA10040,擦除芯片后烧录<pc-ble-driver dir>\hex\sd_api_v5\connectivity_2.0.1_1m_with_s132_5.0.hex,其中文件名中的1m表示波特率为1000000。

打开cmd窗口,并依次执行以下命令,其中COMx表示该开发板在系统中对应的串口号。

> cd <hrm_v5.exe dir>
> hrm_v5 COMx

运行成功则可以看到设备开始广播的日志信息:

(6)创建VS工程

有些时候我们希望脱离示例工程,创建一个全新的Visual Studio工程,进行pc-ble-driver开发。

打开Visual Studio 2017,在<pc-ble-driver dir>\examples下创建一个空VC++工程,命名为my_demo。

工程中新建一个源码文件main.c,并将\examples\heart_rate_collector\main.c中的内容复制到这里。

运行一下,会报许多错误。

在Visual Studio的Solution Explorer中,将下列文件夹中的*.h头文件全部拖入Header Files目录:

  • <pc-ble-driver dir>\include\common
  • <pc-ble-driver dir>\include\common\sdk_compat
  • <pc-ble-driver dir>\src\sd_api_v5\sdk\components\softdevice\s132\headers

打开工程配置菜单:Project –> my_demo Properities…

在C/C++ –> All Options分支中,做如下配置:

Option Value
Additional Include Directories $(SolutionDir)..\..\include\common,

$(SolutionDir)..\..\include\common\sdk_compat,

$(SolutionDir)..\..\include\common\internal\transport,

$(SolutionDir)..\..\src\sd_api_v5\sdk\components\softdevice\s132\headers

Compile As Compile As C Code (/TC)
Preprocessor Definitions WIN32, _WINDOWS, NRF_SD_BLE_API=5, PC_BLE_DRIVER_STATIC, _CRT_SECURE_NO_WARNINGS

在Linker –> All Options分支中,做如下配置:

Option Value
Additional Dependencies pc_ble_driver_static_sd_api_v5.lib,

libboost_thread-vc140-mt-gd-1_64.lib,

libboost_system-vc140-mt-gd-1_64.lib,

libboost_regex-vc140-mt-gd-1_64.lib,

libboost_date_time-vc140-mt-gd-1_64.lib,

libboost_chrono-vc140-mt-gd-1_64.lib

Additional Library Directories $(SolutionDir)..\..\build,

$(SolutionDir)..\..\build\$(Configuration),

$(BOOST_ROOT)\stage\lib

保存并关闭配置窗口,重新Build一下工程,应该已经没有错误了。

此时就可以按照常规的VC++工程来编写和调试代码。

 

(完)