在 Windows CE 與 Windows Mobile 裝置上,GPS 接收器等設備常以串口(Serial Port/Com Port)提供存取介面,透過串口接收 NMEA 資料。CF.NET 2.0 起,微軟將串口操作封裝於 System.IO.Ports.SerialPort,大幅簡化操作,無需 P/Invoke。
分離發送與接收邏輯,分別在不同裝置運行:
public class ReceiverPort : IDisposable
{
private readonly System.IO.Ports.SerialPort serialPort;
public ReceiverPort()
{
serialPort = new System.IO.Ports.SerialPort("COM1", 4800,
System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One);
serialPort.Handshake = System.IO.Ports.Handshake.None;
try
{
serialPort.DataReceived += new
System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort_DataReceived);
serialPort.Open();
if (serialPort.IsOpen)
Console.WriteLine("Open the serial port successful");
else
Console.WriteLine("Fail to open the serial port");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
public void Dispose()
{
if (serialPort.IsOpen) serialPort.Close();
serialPort.Dispose();
}
private void serialPort_DataReceived(object sender,
System.IO.Ports.SerialDataReceivedEventArgs e)
{
Console.WriteLine("RECEIVED:" + serialPort.ReadLine());
}
}
public class SenderPort : IDisposable
{
private readonly System.IO.Ports.SerialPort serialPort;
public SenderPort()
{
serialPort = new System.IO.Ports.SerialPort("COM1", 4800,
System.IO.Ports.Parity.None, 8, System.IO.Ports.StopBits.One);
serialPort.Handshake = System.IO.Ports.Handshake.None;
try
{
serialPort.Open();
if (serialPort.IsOpen)
Console.WriteLine("Open the serial port successful");
else
Console.WriteLine("Fail to open the serial port");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
public void Dispose()
{
if (serialPort.IsOpen) serialPort.Close();
serialPort.Dispose();
}
public bool Send(string str)
{
try
{
if (serialPort.IsOpen)
{
Console.WriteLine("SENT:" + str);
serialPort.WriteLine(str + "\r");
return true;
}
return false;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return false;
}
}
}
COM1(依實際硬體調整)DataReceived 事件非同步處理IDisposable 確保關閉與釋放此模式適用於嵌入式裝置間的可靠串口通訊,代碼結構清晰、易於擴展與維護。