(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 2015或msbuild 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++工程来编写和调试代码。
(完)
你好! 在编译pc-ble-driver-master 源文件的时候报错,请问是哪里出现了问题?
— Check for working CXX compiler: D:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/bin/Hostx86/x86/cl.exe — works
— Detecting CXX compiler ABI info
— Detecting CXX compiler ABI info – done
— Detecting CXX compile features
— Detecting CXX compile features – done
— Architecture not set, using native 32-bit toolchain.
CMake Error at D:/Program Files/CMake/share/cmake-3.12/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
Could NOT find Git (missing: GIT_EXECUTABLE)
Call Stack (most recent call first):
D:/Program Files/CMake/share/cmake-3.12/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE)
D:/Program Files/CMake/share/cmake-3.12/Modules/FindGit.cmake:83 (find_package_handle_standard_args)
cmake/nrf-ble-driver.cmake:87 (find_package)
CMakeLists.txt:30 (include)
“
”
你好!
上一个问题中,安装了git之后OK了,又出现下一个问题,
好像是少了一个配置文件?
F:\Nordic\pc-ble-driver-master\build>cmake -G “Visual Studio 15 2017” ..
— NRF_BLE_DRIVER_VERSION not specified, setting it to 0.0.0
— Selecting Windows SDK version 10.0.17763.0 to target Windows 10.0.17134.
— Architecture not set, using native 32-bit toolchain.
CMake Error at test/CMakeLists.txt:8 (find_package):
Could not find a package configuration file provided by “Catch2” with any
of the following names:
Catch2Config.cmake
catch2-config.cmake
Add the installation prefix of “Catch2” to CMAKE_PREFIX_PATH or set
“Catch2_DIR” to a directory containing one of the above files. If “Catch2”
provides a separate development package or SDK, be sure it has been
installed.
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
ASIO_INCLUDE_DIR
used as include directory in directory F:/Nordic/pc-ble-driver-master
used as include directory in directory F:/Nordic/pc-ble-driver-master
used as include directory in directory F:/Nordic/pc-ble-driver-master
used as include directory in directory F:/Nordic/pc-ble-driver-master
used as include directory in directory F:/Nordic/pc-ble-driver-master
used as include directory in directory F:/Nordic/pc-ble-driver-master
used as include directory in directory F:/Nordic/pc-ble-driver-master
used as include directory in directory F:/Nordic/pc-ble-driver-master
used as include directory in directory F:/Nordic/pc-ble-driver-master
used as include directory in directory F:/Nordic/pc-ble-driver-master
used as include directory in directory F:/Nordic/pc-ble-driver-master
used as include directory in directory F:/Nordic/pc-ble-driver-master
— Configuring incomplete, errors occurred!
See also “F:/Nordic/pc-ble-driver-master/build/CMakeFiles/CMakeOutput.log”.
pc-ble-driver 4.0改动比较大,抛弃了boost。实现pc-ble-driver要结合github上的官方readme来看,本文仅做参考。后面会更新一下文章。
good