首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET Micro Framework 硬體存取實戰 (一):GPIO、串口與腳位管理基礎

     編輯:關於.NET

GPIO 基礎:輸出、輸入與中斷

Microsoft.SPOT.Hardware 命名空間提供三大埠類別,皆繼承 Port 基類。

1. 輸出埠:OutputPort


// 腳位定義建議封裝於專屬類別,避免硬編碼
public static class MyPins { public const Cpu.Pin StatusLED = Cpu.Pin.GPIO_Pin0; }

var led = new OutputPort(MyPins.StatusLED, true); // 初始高電平 (亮)

// 1Hz 閃爍
while (true)
{
    Thread.Sleep(500);
    led.Write(!led.Read()); // 翻轉電平
}

2. 輸入埠:InputPort


var btn = new InputPort(
    Cpu.Pin.GPIO_Pin2,
    false,                      // 不濾除毛刺
    Port.ResistorMode.PullDown  // 下拉電阻:按鈕按下 → 高電平
);

while (true)
{
    bool state = btn.Read();
    Debug.Print($"Pin {btn.Id}: {(state ? "High" : "Low")}");
    Thread.Sleep(10);
}
  • ResistorMode:PullUp (預設高、按下拉低)、PullDown (預設低、按下拉高)、Disabled (外部自備電阻)。

3. 中斷埠:InterruptPort (事件驅動、省電)

避免輪詢浪費 CPU,MCU 可進入睡眠模式等待外部事件喚醒。


// 雙邊沿觸發 (按下+釋放皆中斷)
var intPort = new InterruptPort(
    Cpu.Pin.GPIO_Pin3,
    false,
    Port.ResistorMode.PullDown,
    Port.InterruptMode.InterruptEdgeBoth);

intPort.OnInterrupt += (pin, state, time) =>
    Debug.Print($"INT: Pin={pin}, State={state}, Time={time}");

Thread.Sleep(Timeout.Infinite); // 主執行緒休眠,等待中斷

電平觸發模式 (需手動清除)


var levelPort = new InterruptPort(
    Cpu.Pin.GPIO_Pin2, false, Port.ResistorMode.PullUp,
    Port.InterruptMode.InterruptEdgeLevelLow); // 低電平持續觸發

levelPort.OnInterrupt += (pin, state, time) =>
{
    Debug.Print($"LEVEL INT: {pin} {state} {time}");
    levelPort.ClearInterrupt(); // 必須清除,否則持續觸發
};
Thread.Sleep(Timeout.Infinite);

串口通訊:SerialPort (RS-232/UART)

位於 Microsoft.SPOT.Hardware.SerialPort (非 System.IO.Ports)。

發送資料


var config = new SerialPort.Configuration(
    SerialPort.Serial.COM1,
    SerialPort.BaudRate.Baud9600,
    false); // 無流控

var serial = new SerialPort(config);
byte[] data = Encoding.UTF8.GetBytes("Hello World!\r\n");
serial.Write(data, 0, data.Length); // MF 無需 Open()
serial.Dispose();

接收資料 (輪詢)


var config = new SerialPort.Configuration(SerialPort.Serial.COM1, SerialPort.BaudRate.Baud115200, false);
var serial = new SerialPort(config);
byte[] buf = new byte[32];

while (true)
{
    int count = serial.Read(buf, 0, buf.Length, 0); // 逾時 0 = 非阻塞
    if (count > 0)
    {
        string msg = new string(Encoding.UTF8.GetChars(buf, 0, count));
        Debug.Print(msg);
    }
    Thread.Sleep(10);
}

腳位管理:HardwareProvider 防衝突機制

MCU 腳位常具多功能 (GPIO/UART/SPI/I2C),需**靜態宣告**用途避免衝突。

自訂 Provider 保留 UART 腳位


internal sealed class MyHardwareProvider : HardwareProvider
{
    public override void GetSerialPins(SerialPort.Serial com, out Cpu.Pin rx, out Cpu.Pin tx)
    {
        switch (com)
        {
            case SerialPort.Serial.COM1: rx = Cpu.Pin.GPIO_Pin0; tx = Cpu.Pin.GPIO_Pin1; break;
            case SerialPort.Serial.COM2: rx = Cpu.Pin.GPIO_Pin2; tx = Cpu.Pin.GPIO_Pin3; break;
            default: rx = tx = Cpu.Pin.GPIO_NONE; break;
        }
    }
}

// 註冊 (需在建立任何 SerialPort/I2C/SPI 之前)
HardwareProvider.Register(new MyHardwareProvider());

// 此時建立 COM1 會自動綁定 Pin0/Pin1
var portA = new SerialPort(new SerialPort.Configuration(SerialPort.Serial.COM1, ...));
// var portB = new SerialPort(...); // 拋出例外:腳位已被佔用

總結

類別用途關鍵參數
OutputPortLED、繼電器、驅動模組初始電平、Write/Read
InputPort按鈕、開關、數位感測器ResistorMode、毛刺過濾
InterruptPort事件驅動、喚醒、省電InterruptMode (Edge/Level)、ClearInterrupt
SerialPortGPS、Modbus、調試輸出BaudRate、流控、Read/Write
HardwareProvider腳位多功能衝突仲裁GetSerialPins/GetI2CPins/GetSpiPins

.NET Micro Framework 將硬體存取封裝為**強型別、物件導向、自動資源管理**的 API,配合 Visual Studio 遠端偵錯,讓嵌入式開發體驗接近桌面應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved