烽火社区
标题:
02.[bluebanboom]C#也玩GPIO
[打印本页]
作者:
sailf0x
时间:
2016-8-11 09:26 PM
标题:
02.[bluebanboom]C#也玩GPIO
玩儿的就是语言,大牛炫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号引脚,也可以通过命令行参数设定想要使用的引脚。
$ sudo mono led.exe 40
复制代码
附上完整的代码。
csharp.tar.gz.zip
作者:
zty615
时间:
2016-8-11 09:31 PM
强悍啊,可以做成参数就通用了
用程序分辨M1,M2+,Neo,有什么好办法嘛?
GPIO.GPIO gpio = new GPIO.GPIO(Borad.BPI_M2p);
欢迎光临 烽火社区 (https://bbs.cnecport.com/)
Powered by Discuz! X3.2