网络上相关使用C#/CSharp调用树莓派GPIO口的资料还是比较少,而且大部分都是国外的资料看起来都比较吃力,我这里就分享一些我自己使用C#操作树莓派/RPI的GPIO接口的一些相关经验。
刚开始接触树莓派的时候我在网络上搜索了一大堆C#操作GPIO口的相关资料,的确发现了不少外国人写的一些操作库,而且都有在GIT上面公开,如果你有兴趣的话可以用必应搜索去找,如果有条件可以使用谷歌也行,百度很难找到国外的关于这方面的相关东西。
我这里直接使用C语言封装bcm2835的函数库,然后使用C#进行调用即可,因为bcm2835大部分操作都是比较底层的东西,这样让我更加喜欢他。
开始的时候我本来打算封装 wiringPi 的函数库的,但是不知道为什么我在C语言下使用树莓派3b树莓派4b调用wiringPi的pinMode函数总是出错,捣鼓了半天也没发现到什么问题,后来放弃了wiringPi转向bcm2835。我是从易语言转到C#的最后也学了一些C语言,个人感觉wiringPi的函数命令更加符合我的一些操作逻辑,bcm2835的函数看起来有些小纠结情节,但是不影响我们的正常使用。
开始正题,这里先给出一些相关链接
wiringPi 官方地址:http://wiringpi.com/
bcm2835 C库地址:http://www.airspayce.com/mikem/bcm2835/index.html
我们先安装好一些基础环境
sudo apt-get install gcc g++ wget make -y
cd /home/pi
按照bcm2835官网提供的下载地址下载源代码
wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.60.tar.gz
解压源代码压缩包文件
tar zxvf bcm2835-1.60.tar.gz
cd bcm2835-1.60
./configure
make
sudo make check
sudo make install
按照上面的指令进行操作,如果没有错误就说明一切都准备就绪了,接下来我们就把 bcm2835.c 这个源代码文件编译为 so 文件,在linux下 so 文件就类似于windows下的 dll 动态链接库文件,我们只需要在C#里面像声明dll函数一样,声明函数就可以调用到bcm2835.so 里面的函数了。
进入代码文件目录
cd src/
编译 bcm2835.c 这个文件为so共享库文件
gcc -shared -o bcm2835.so bcm2835.c
上面的指令执行编译完毕后,会在当前目录下生成一个 bcm2835.so 的文件,这个就是我们需要的文件,下面我们试试编写C#代码来测试一下是否可以正常使用。
using System;
using System.Runtime.InteropServices;
namespace sotest
{
class Program
{
//我这里引用 bcm2835.so 库的绝对路径,你也可以通过添加环境变量使用相对路径进行调用
[DllImport("/home/pi/Downloads/sotest/bcm2835.so",EntryPoint="bcm2835_init")]
static extern int bcm2835_init();
[DllImport("/home/pi/Downloads/sotest/bcm2835.so",EntryPoint="bcm2835_close")]
static extern int bcm2835_close ();
[DllImport("/home/pi/Downloads/sotest/bcm2835.so",EntryPoint="bcm2835_set_debug")]
static extern void bcm2835_set_debug();
[DllImport("/home/pi/Downloads/sotest/bcm2835.so",EntryPoint="bcm2835_version")]
static extern double bcm2835_version();
public static void Main(string[] args)
{
Console.Write("bcm2835_version : {0}\n",bcm2835_version());
Console.Write("bcm2835_init : {0}\n",bcm2835_init());
Console.Write("Press any key to continue . . . \n");
Console.ReadKey(true);
}
}
}
经过测试,是可以正常调用 bcm2835.so 共享库函数的,由于我这里使用了虚拟机进行测试编写文章的,虚拟机没有GPIO接口所以调用函数出现了错误,在实际树莓派上是可以正常使用的。
温馨提醒:bcm2835 库里面调用的函数有部分函数需要 root 权限,最好建议你运行程序的时候使用管理员权限来调用。
使用管理员权限运行程序
sudo mono sotest.exe
这里我就不写如何封装 wiringPi 了,封装方法和 bcm2835 的一样,具体自己尝试一下。
bcm2835 C 库API列表自己到官网看一下:
http://www.airspayce.com/mikem/bcm2835/modules.html
http://www.airspayce.com/mikem/bcm2835/examples.html