.NET Compact Framework下的串列埠通訊

iDotNetSpace發表於2009-04-09

在Wince和Windows Mobile下,很多裝置以串列埠(Serial Port/Com Port)的方式提供訪問介面,例如可以通過串列埠訪問GPS的receiver,從而接收NMEA Data。

在CF.NET2.0開始,MS把串列埠操作封裝了到System.IO.Ports.SerialPort裡面,大大簡便了對串列埠的操作,不再需要P/Invoke就可以直接操作串列埠。

下面展現兩個串列埠通訊類,一個負責發生,一個負責接收,兩個類分別在不要的裝置上執行。

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt    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;
                }
                
else
                {
                    
return false;
                }
            }
            
catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                
return false;
            }
        }
    }

進行串列埠通訊,需要通訊雙方執行共同的協議,所謂共同的協議就是通訊的引數相同,通訊引數包括BaudRate,Parity,DataBits,StopBits和Handshake。比較關鍵的是波特率(BaudRate),通訊想法BaudRate應該一樣。

SerialPort的建構函式第一個引數是埠號,埠號一般由'COM'加上數字組成,例如例子上的COM1。

所有的串列埠操作都是基於logic serial port(邏輯串列埠),並不是physical serial port(物理串列埠),邏輯串列埠到物理串列埠是有驅動程式進行對映到,也就是在使用的裝置上安裝相應的驅動程式,這個邏輯串列埠就存在,對這個邏輯串列埠操作並不是說可以正常通訊,還需要檢查硬體連線。對邏輯串列埠操作有一個好處是同樣的程式可以對物理的串列埠或者虛擬的串列埠進行操作。

在ReceiverPort需要註冊一個接收函式serialPort_DataReceived到delegate,這樣當接收到資料時就回撥這個處理函式。


由於串列埠操作是唯一,排他和獨佔的操作,因此使用後最好Dispose。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-586869/,如需轉載,請註明出處,否則將追究法律責任。

相關文章