【树莓派/RaspberryPi】C#调用bcm2835/wiringPi的C语言库操作GPIO/I2C/SPI/PWM 网络上相关使用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的函数看起来有些小纠结情节,但是不影响我们的正常使用。 开始正题,这里先给出一些相关链接 - 我们先安装好一些基础环境
- 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 的一样,具体自己尝试一下。
https://www.tqwba.com/x_d/jishu/285384.html
|