查看: 2657|回复: 1
打印 上一主题 下一主题

02.[bluebanboom]C#也玩GPIO

[复制链接] qrcode

23

主题

26

帖子

79

积分

注册会员

Rank: 2

积分
79
楼主
跳转到指定楼层
发表于 2016-8-11 09:26 PM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
玩儿的就是语言,大牛炫Q在Neo上跑起了C#(【炫Q NanoPi M1】之五:linux下的mono装个.net跑c#),这给我们又带来了新玩具。讲真,不怎么懂C#,不过简简单单玩GPIO还不算太困难。特别是有了之前写好的GPIO库,就大大降低了难度了。其实是偷懒了。思路是这样的,C#调用C代码写好的GPIO库,但是不能直接代码级别的。在Windows平台下,我们可以把C代码编译成一个DLL库,让C#调用。同样,在Linux下有so文件,那么我们把C的GPIO编译成一个so呢?C#是不是就可以调用了?先来安装C#。


  1. $ sudo apt-get install mono-complete
复制代码


注意,mono比较大,确保自己的SD卡已经扩容了,如果没有,可以用跟树莓派一样的方式扩容,执行(sudo raspi-config)扩容。


再来将C编译成so。


  1. $ gcc -c -Wall -Werror -fpic gpio.c
  2. $ gcc -shared -o libgpio.so gpio.o
复制代码


这样就生成好一个libgpio.so文件。接下来我们用C#封装一下C的GPIO,代码如下:


  1. using System;
  2. using System.Runtime.InteropServices;

  3. namespace GPIO
  4. {
  5.     public class GPIO
  6.     {
  7.         
  8.         // 定义基本常量
  9.         public readonly int INPUT    = 0;
  10.         public readonly int OUTPUT   = 1;
  11.         public readonly int LOW      = 0;
  12.         public readonly int HIGH     = 1;
  13.         public readonly int PUD_OFF  = 0;
  14.         public readonly int PUD_UP   = 1;
  15.         public readonly int PUD_DOWN = 2;
  16.         
  17.         // 引入libgpio
  18.         [DllImport("libgpio.so")]
  19.         private static extern int setup();
  20.         [DllImport("libgpio.so")]
  21.         private static extern void cleanup();
  22.         [DllImport("libgpio.so")]
  23.         private static extern void pinMode(int pin, int mode);
  24.         [DllImport("libgpio.so")]
  25.         private static extern void pullUpDnControl(int pin, int mode);
  26.         [DllImport("libgpio.so")]
  27.         private static extern int  digitalRead(int pin) ;
  28.         [DllImport("libgpio.so")]
  29.         private static extern void digitalWrite(int pin, int value) ;
  30.         [DllImport("libgpio.so")]
  31.         private static extern void delay (uint howLong);
  32.         [DllImport("libgpio.so")]
  33.         private static extern void delayMicroseconds (uint howLong);
  34.         
  35.         // 封装GPIO函数
  36.         public int Setup()
  37.         {
  38.             return setup();
  39.         }
  40.         
  41.         public void Cleanup()
  42.         {
  43.             cleanup();
  44.         }
  45.         
  46.         public void PinMode(int Pin, int Mode)
  47.         {
  48.             pinMode(Pin, Mode);
  49.         }
  50.         
  51.         public void PullUpDnControl(int Pin, int Mode)
  52.         {
  53.             pullUpDnControl(Pin, Mode);   
  54.         }
  55.         
  56.         public int DigitalRead(int Pin)
  57.         {
  58.             return digitalRead(Pin);
  59.         }
  60.         
  61.         public void DigitalWrite(int Pin, int Value)
  62.         {
  63.             digitalWrite(Pin, Value);
  64.         }
  65.         
  66.         public void Delay(uint Howlong)
  67.         {
  68.             delay(Howlong);
  69.         }
  70.         
  71.         public void DelayMicroseconds(uint HowLong)
  72.         {
  73.             delayMicroseconds(HowLong);
  74.         }
  75.     }
  76. }
复制代码


好了,这样我们就可以通过GPIO这个类来操纵GPIO了。国际惯例,先点灯。代码如下


  1. using System;
  2. using GPIO;

  3. namespace Test
  4. {
  5.     class Program
  6.     {
  7.         static void Main(string[] args)
  8.         {
  9.             int LED = 11;
  10.             if (args.Length == 1) {
  11.                 LED = Int32.Parse(args[0]);
  12.             }
  13.             
  14.             Console.WriteLine(string.Format("Using Pin[{0:G}]", LED));
  15.             
  16.             GPIO.GPIO gpio = new GPIO.GPIO();
  17.             Console.WriteLine("Blink Led");
  18.             gpio.Delay(3000);
  19.             
  20.             if (gpio.Setup() == 0) {
  21.                 Console.WriteLine("-> GPIO Init Success.");
  22.                 gpio.PullUpDnControl(LED, gpio.PUD_UP);
  23.                 gpio.PinMode(LED, gpio.OUTPUT);
  24.                 gpio.Delay(1000);
  25.         
  26.                 for (int i = 0; i < 5; i++) {
  27.                     gpio.DigitalWrite(LED, gpio.LOW);
  28.                     gpio.Delay(1000);
  29.                     gpio.DigitalWrite(LED, gpio.HIGH);
  30.                     gpio.Delay(1000);
  31.                 }
  32.                 gpio.Cleanup();
  33.             }
  34.             else {
  35.                 Console.WriteLine("-> GPIO Init Failed.");
  36.             }
  37.         }
  38.     }
  39. }
复制代码


代码都写好之后就是编译cs代码了。


  1. $ mcs led.cs gpio.cs
  2. $ sudo mono led.exe
复制代码
默认用的是11号引脚,也可以通过命令行参数设定想要使用的引脚。

  1. $ sudo mono led.exe 40
复制代码
附上完整的代码。
csharp.tar.gz.zip




回复

使用道具 举报

0

主题

88

帖子

16

积分

新手上路

Rank: 1

积分
16
沙发
发表于 2016-8-11 09:31 PM | 只看该作者
强悍啊,可以做成参数就通用了
用程序分辨M1,M2+,Neo,有什么好办法嘛?

GPIO.GPIO gpio = new GPIO.GPIO(Borad.BPI_M2p);
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表