ETRD博客

VS使用wiringPi库控制树莓派的GPIO

引言

前面我们已经实现了在Windows下使用VS建立工程并利用交叉编译工具链可以编译生成在树莓派上可以运行的程序。众所周知,现在各个研发公司完全从0开始做开发已经不常见了,较为普遍的是基于一些已有的代码来加速开发自己的应用。同样的,很多具有开源精神的技术牛人为树莓派或者说Linux写了很多库,不管是不是开源的,它们编写的初衷都是将这些库直接安装到对应的系统中,由对应的系统进行调用的。那我们使用交叉编译工具的情况下,在Windows平台下使用Visual Studio开发,如果VS不知道这些库没法引用相应的库文件,那是没有办法编译的,更别谈生产执行程序了。因此本文解决的问题非常简单,思路也非常清晰,在VS中同步树莓派中安装的库文件以进行调用。

wiringPi简介

这是一个开源的控制树莓派的GPIO库,使用他提供的API可以方便的操作树莓派留给用户的GPIO口。通常要控制一块芯片的GPIO最原始的做法是根据芯片的datasheet去控制对应的寄存器来实现,但这需要用户对芯片本身及硬件底层比较了解,而wiringpi则可以让你完全不懂底层也无需关系芯片datasheet的情况下调用API即可实现控制。它的源代码及相关信息在其官网提供。使用这个库之前当然得安装,本文的主要内容就是安装这个库并在VS中同步它。

VisualGDB的配置

VisualGDB这款插件,它的便利性就在于,它可以非常简单的帮我们实现Windows下交叉编译工具链中的库文件与目标系统树莓派中的库文件的同步,这样子VS就可以轻松引用相应的头文件,并进行函数调用了。

打开上一篇文章中在Windows下建立的第一个工程,在VS的解决方案资源管理器中右键,选择 VisualGDB Project Properties

QQ截图20170127102437

左侧选择MSBuild setting标签,可以发现右边有一个Synchronize按钮,这个按钮就是用来同步VS中交叉编译工具中的库与目标系统树莓派中的库的

QQ截图20170127102926

点击按钮,可以发现,它已经自动帮我们列出了需要同步的文件夹

QQ截图20170127103249

我们按照其推荐的选项,需要同步的树莓派中的文件下是:

1
2
3
4
5
6
7
/lib	
/usr/include
/usr/lib
/usr/local/include
/usr/local/lib
/etc
/opt

这些显然是树莓派Raspbian系统中的目录,我们可以通过远程桌面查看一下/usr/include这个路径

QQ截图20170127103944

显然在树莓派中是有这个路径的,并且我们以一个wiringPi.h文件来作为参考,打开这个文件

QQ截图20170127104258

根据VS中VisualGDG的配置,在Windows下本地存放这些同步过来的文件的路径是

1
D:\SysGCC\Raspberry\arm-linux-gnueabihf\sysroot

在Windows下打开这个路径,并进入/usr/include,查看一下

QQ截图20170127104636

同样发现了这个文件,并且跟树莓派中的文件是一样的,这说明了两个问题,一是VisualGDB已经在我第一次建立工程的时候已经帮我同步过了树莓派系统中的库,我猜测是在建立工程填好SSH之后就自动帮我完成了。二是我树莓派中安装的Raspbian系统默认集成安装了控制GPIO的wiringPi这个开源库,在树莓派终端中输入指令确认一下:

1
gpio -v

QQ截图20170127105036

为了演示一个完整的库安装以及安装最新的wiringPi库,更重要的是验证visualGDB的库同步功能,我决定先卸载这个旧的wiringPi库,调用wiringPi官方提供的步骤中的删除命令

1
sudo apt-get purge wiringpi

QQ截图20170127110136

安装wiringPi库

通过GIT获取wiringPi安装包

1
sudo git clone git://git.drogon.net/wiringPi

通过如下指令编译/安装

1
2
cd ~/wiringPi
sudo ./build

如果提示一些权限不够的错误,记住查看指令前是否加了sudo。

如果遇到任何问题,建议严格按照wiringpi官方步骤多试试

我卸载系统预装的wiringpi以后,重新安装,我发现/usr/include目录下已经没有wiringpi.h这些文件了,而是被安装在了/usr/local下面,这可能是我以pi用户安装与系统预装的区别吧。

VisualGDB同步问题

在VS中通过前面步骤中提到的Synchronize按钮进行同步

QQ截图20170127140208

我发现这个同步似乎是单向的,也就是visualGDB只是单纯的将树莓派中指定的目录下的文件copy过来,此时我发现了问题,由于之前的wiringpi是系统预装的,VisualGDB同步过一次,然后我在树莓派中将系统预装的wiringpi卸载以后,再次安装,应该是由于在pi用户下安装的缘故,wiringpi的安装文件被释放在与原来不同的目录,虽然在树莓派中/usr/include目录下已经没有了wiringpi.h这个文件,但此时如果我在VS中使用VisualGDB进行同步库,在我的windows系统中D:\SysGCC\Raspberry\arm-linux-gnueabihf\sysroot\usr\include目录下仍旧存在原来那个旧的wiringpi.h。因此visualGDB应该只会下载新的文件,而会保留旧的文件。新的wiringpi.h文件在同步后的目录是在

1
D:\SysGCC\Raspberry\arm-linux-gnueabihf\sysroot\usr\local\include

而旧的wiringpi.h文件仍然保留在目录

1
D:\SysGCC\Raspberry\arm-linux-gnueabihf\sysroot\usr\include

我尝试在vs中include这个头文件

QQ截图20170127145013

果然它引用的是旧文件,而不是新的,应该是/usr/include目录下优先级更高,但这显然不是我所期望的,因此我决定冒险一试将

1
D:\SysGCC\Raspberry\arm-linux-gnueabihf\sysroot

目录下的文件手动清空,然后再用VisualGDB进行一次同步。但SysrootInfo.xml文件不要删掉,它保存这需要同步的目录信息,如果不小心删掉也可以按照前面的同步目录进行手动添加,

QQ截图20170127151924

此时,同步目录中就只有一个最新的wiringpi.h文件了

QQ截图20170127155934

再在VS中引用头文件,发现仍旧找不到

QQ截图20170127160016

还是打开VisualGDB的配置对话框,添加include的头文件查找目录

QQ截图20170127160136

通过添加按钮,把两个include目录都添加进来

QQ截图20170127160354

并且,你还需要添加两个库名

1
wiringPi;wiringPiDev

QQ截图20170127162850

否则调用库函数时会提示没有定义的错误,这实际上在树莓派中安装wiringpi时执行./build命令是提示了

QQ截图20170127163121

同样的,如果你的工程中用到线程创建函数,你同样需要填入线程库的名称,否则会提示pthread_create未定义的错误,这是一个写入了线程库的例子:

QQ截图20170216172831

此时程序中错误消失,且wiringpi.h的引用为最新的头文件

QQ截图20170127160505

QQ截图20170127160616

另外一方面,从VisualGDB同步时的提示来看,其是Downloading remote directories因此它应该只是从远程下载而不是严格意义上的同步,但这样子是不是树莓派中每安装一个新的库就需要把本地同步下来的库先删掉再同步一次呢,显然是不需要的,只有像我那样多此一举将系统预装的库卸载再重装才会遇到这么多麻烦,如果我是直接调用库的更新命令,应该就没有这些麻烦了。

写一段简单的IO操作代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <wiringPi.h>

int main(int argc, char *argv[])
{

wiringPiSetup();
const int pinNumber = 2;

pinMode(pinNumber, OUTPUT);

for (;;)
{
digitalWrite(pinNumber, HIGH);
delay(100);
digitalWrite(pinNumber, LOW);
delay(100);
}
return 0;
}

这段代码引用自VisualGDB官网的wiringpi教程里面,接着便可以进行编译调试了。

小结

在树莓派(Linux)中安装了新的库时,要在Windows下引用这个库,则需要在VisualGDB中进行一次同步,由于VisualGDB的同步仅仅是从远程端下载相应的库文件并不是严格的同步,因此,如果你是跟我一样卸载掉原有的库再安装了一个新的库,请检查是否我有遇到的库路径不同而导致没有引用到最新库的问题,如果有可以删掉原有同步的库再进行同步,这样便能确保Windows下的库与树莓派中库的严格一致性。同时注意添加头文件路径以及填入需要引用的库的名称。

参考文献

http://visualgdb.com/

http://wiringpi.com/download-and-install/

http://visualgdb.com/tutorials/raspberry/wiringPi/