.NET Framework串口通信詳細(xì)內(nèi)容介紹
.NET Framework為程序員提供了一個(gè)WEB應(yīng)用程序部署環(huán)境,它的推出就是為了能夠幫助程序員提供一個(gè)良好的開發(fā)環(huán)境,提高代碼編寫效率。在Wince和Windows Mobile下,很多設(shè)備以串口(Serial Port/Com Port)的方式提供訪問接口,例如可以通過串口訪問GPS的receiver,從而接收NMEA Data。#t#
在CF.NET2.0開始,MS把串口操作封裝了到System.IO.Ports.SerialPort里面,大大簡(jiǎn)便了對(duì)串口的操作,不再需要P/Invoke就可以直接操作.NET Framework串口通信。
下面展現(xiàn)兩個(gè).NET Framework串口通信類,一個(gè)負(fù)責(zé)發(fā)生,一個(gè)負(fù)責(zé)接收,兩個(gè)類分別在不要的設(shè)備上運(yùn)行。
- 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.SerialDataReceived
EventHandler(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_Data
Received(object sender, - System.IO.Ports.SerialDataReceived
EventArgs 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;
- }
- }
- }
進(jìn)行.NET Framework串口通信,需要通信雙方執(zhí)行共同的協(xié)議,所謂共同的協(xié)議就是通信的參數(shù)相同,通信參數(shù)包括BaudRate,Parity,DataBits,StopBits和Handshake。比較關(guān)鍵的是波特率(BaudRate),通信想法BaudRate應(yīng)該一樣。
SerialPort的構(gòu)造函數(shù)***個(gè)參數(shù)是端口號(hào),端口號(hào)一般由'COM'加上數(shù)字組成,例如例子上的COM1。
所有的串口操作都是基于logic serial port(邏輯串口),并不是physical serial port(物理串口),邏輯串口到物理串口是有驅(qū)動(dòng)程序進(jìn)行映射到,也就是在使用的設(shè)備上安裝相應(yīng)的驅(qū)動(dòng)程序,這個(gè)邏輯串口就存在,對(duì)這個(gè)邏輯串口操作并不是說可以正常通信,還需要檢查硬件連接。對(duì)邏輯串口操作有一個(gè)好處是同樣的程序可以對(duì)物理的串口或者虛擬的串口進(jìn)行操作。
在ReceiverPort需要注冊(cè)一個(gè)接收函數(shù)serialPort_DataReceived到delegate,這樣當(dāng)接收到數(shù)據(jù)時(shí)就回調(diào)這個(gè)處理函數(shù)。
由于.NET Framework串口通信操作是唯一,排他和獨(dú)占的操作,因此使用后***Dispose。






