Microsoft.SPOT.Hardware 命名空間提供三大埠類別,皆繼承 Port 基類。
// 腳位定義建議封裝於專屬類別,避免硬編碼
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()); // 翻轉電平
}
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 (外部自備電阻)。避免輪詢浪費 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);
位於 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);
}
MCU 腳位常具多功能 (GPIO/UART/SPI/I2C),需**靜態宣告**用途避免衝突。
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(...); // 拋出例外:腳位已被佔用
| 類別 | 用途 | 關鍵參數 |
|---|---|---|
| OutputPort | LED、繼電器、驅動模組 | 初始電平、Write/Read |
| InputPort | 按鈕、開關、數位感測器 | ResistorMode、毛刺過濾 |
| InterruptPort | 事件驅動、喚醒、省電 | InterruptMode (Edge/Level)、ClearInterrupt |
| SerialPort | GPS、Modbus、調試輸出 | BaudRate、流控、Read/Write |
| HardwareProvider | 腳位多功能衝突仲裁 | GetSerialPins/GetI2CPins/GetSpiPins |
.NET Micro Framework 將硬體存取封裝為**強型別、物件導向、自動資源管理**的 API,配合 Visual Studio 遠端偵錯,讓嵌入式開發體驗接近桌面應用。