【树莓派/RaspberryPi】C#调用bcm2835/wiringPi的C语言库操作GPIO/I2C/SPI/PWM

原创 Yearn  2019-12-09 11:15:14  阅读 997 次 评论 0 条

网络上相关使用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);
        }
    }
}


【树莓派/RaspberryPi】C#调用bcm2835/wiringPi的C语言库操作GPIO/I2C/SPI/PWM


经过测试,是可以正常调用 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

打赏
本文地址:https://www.yfyun.xin/index.php/post/36.html
版权声明:本文为原创文章,版权归 Yearn 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

还没有留言,还不快点抢沙发?