|
玩儿的就是语言,大牛炫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#。
- $ sudo apt-get install mono-complete
复制代码
注意,mono比较大,确保自己的SD卡已经扩容了,如果没有,可以用跟树莓派一样的方式扩容,执行(sudo raspi-config)扩容。
再来将C编译成so。
- $ gcc -c -Wall -Werror -fpic gpio.c
- $ gcc -shared -o libgpio.so gpio.o
复制代码
这样就生成好一个libgpio.so文件。接下来我们用C#封装一下C的GPIO,代码如下:
- using System;
- using System.Runtime.InteropServices;
- namespace GPIO
- {
- public class GPIO
- {
-
- // 定义基本常量
- public readonly int INPUT = 0;
- public readonly int OUTPUT = 1;
- public readonly int LOW = 0;
- public readonly int HIGH = 1;
- public readonly int PUD_OFF = 0;
- public readonly int PUD_UP = 1;
- public readonly int PUD_DOWN = 2;
-
- // 引入libgpio
- [DllImport("libgpio.so")]
- private static extern int setup();
- [DllImport("libgpio.so")]
- private static extern void cleanup();
- [DllImport("libgpio.so")]
- private static extern void pinMode(int pin, int mode);
- [DllImport("libgpio.so")]
- private static extern void pullUpDnControl(int pin, int mode);
- [DllImport("libgpio.so")]
- private static extern int digitalRead(int pin) ;
- [DllImport("libgpio.so")]
- private static extern void digitalWrite(int pin, int value) ;
- [DllImport("libgpio.so")]
- private static extern void delay (uint howLong);
- [DllImport("libgpio.so")]
- private static extern void delayMicroseconds (uint howLong);
-
- // 封装GPIO函数
- public int Setup()
- {
- return setup();
- }
-
- public void Cleanup()
- {
- cleanup();
- }
-
- public void PinMode(int Pin, int Mode)
- {
- pinMode(Pin, Mode);
- }
-
- public void PullUpDnControl(int Pin, int Mode)
- {
- pullUpDnControl(Pin, Mode);
- }
-
- public int DigitalRead(int Pin)
- {
- return digitalRead(Pin);
- }
-
- public void DigitalWrite(int Pin, int Value)
- {
- digitalWrite(Pin, Value);
- }
-
- public void Delay(uint Howlong)
- {
- delay(Howlong);
- }
-
- public void DelayMicroseconds(uint HowLong)
- {
- delayMicroseconds(HowLong);
- }
- }
- }
复制代码
好了,这样我们就可以通过GPIO这个类来操纵GPIO了。国际惯例,先点灯。代码如下
- using System;
- using GPIO;
- namespace Test
- {
- class Program
- {
- static void Main(string[] args)
- {
- int LED = 11;
- if (args.Length == 1) {
- LED = Int32.Parse(args[0]);
- }
-
- Console.WriteLine(string.Format("Using Pin[{0:G}]", LED));
-
- GPIO.GPIO gpio = new GPIO.GPIO();
- Console.WriteLine("Blink Led");
- gpio.Delay(3000);
-
- if (gpio.Setup() == 0) {
- Console.WriteLine("-> GPIO Init Success.");
- gpio.PullUpDnControl(LED, gpio.PUD_UP);
- gpio.PinMode(LED, gpio.OUTPUT);
- gpio.Delay(1000);
-
- for (int i = 0; i < 5; i++) {
- gpio.DigitalWrite(LED, gpio.LOW);
- gpio.Delay(1000);
- gpio.DigitalWrite(LED, gpio.HIGH);
- gpio.Delay(1000);
- }
- gpio.Cleanup();
- }
- else {
- Console.WriteLine("-> GPIO Init Failed.");
- }
- }
- }
- }
复制代码
代码都写好之后就是编译cs代码了。
- $ mcs led.cs gpio.cs
- $ sudo mono led.exe
复制代码 默认用的是11号引脚,也可以通过命令行参数设定想要使用的引脚。
附上完整的代码。
csharp.tar.gz.zip
|
|