您現在的位置是:首頁 > 網路遊戲首頁網路遊戲

C#開發串列埠通訊例項及串列埠基礎

簡介常用方法:名稱說明Close關閉埠連線,將 IsOpen 屬性設定為false,並釋放內部 Stream 物件GetPortNames獲取當前計算機的串列埠名稱陣列Open開啟一個新的串列埠連線Read從SerialPort輸入緩衝區

什麼是防火牆的狀態檢測機制

一、串列埠通訊簡介

序列介面(串列埠)是一種可以將接受來自CPU的並行資料字元轉換為連續的序列資料流傳送出去,同時可將接受的序列資料流轉換為並行的資料字元供給CPU的器件。一般完成這種功能的電路,我們稱為序列介面電路。

串列埠通訊(Serial Communications)的概念非常簡單,串列埠按位(bit)傳送和接收位元組。儘管比按位元組(byte)的並行通訊慢,但是串列埠可以在使用一根線傳送資料的同時用另一根線接收資料。串列埠通訊最重要的引數是波特率、資料位、停止位和奇偶校驗。對於兩個進行通訊的埠,這些引數必須匹配。

1. 波特率:

這是一個衡量符號傳輸速率的引數。指的是訊號被調製以後在單位時間內的變化,即單位時間內載波引數變化的次數,如每秒鐘傳送960個字元,而每個字元格式包含10位(1個起始位,1個停止位,8個數據位),這時的波特率為960Bd,位元率為10位*960個/秒=9600bps。

2. 資料位:

這是衡量通訊中實際資料位的引數。當計算機發送一個資訊包時,實際的資料往往不會是8位的,標準的值是6、7和8位。標準的ASCII碼是0~127(7位),擴充套件的ASCII碼是0~255(8位)。

3. 停止位:

用於表示單個包的最後幾位。典型的值為1,1。5和2位。由於資料是在傳輸線上定時的,並且每一個裝置有其自己的時鐘,很可能在通訊中兩臺裝置間出現了小小的不同步。因此停止位不僅僅是表示傳輸的結束,並且提供計算機校正時鐘同步的機會。

4. 校驗位:

在串列埠通訊中一種簡單的檢錯方式。有四種檢錯方式:偶、奇、高和低。當然沒有校驗位也是可以的。

二、C#串列埠程式設計類

從。NET Framework 2。0開始,C#提供了SerialPort類用於實現串列埠控制。名稱空間:

System.IO.Ports

。其中詳細成員介紹參看MSDN文件。下面介紹其常用的欄位、方法和事件。

1。 常用欄位:

名稱

說明

PortName

獲取或設定通訊埠

BaudRate

獲取或設定序列波特率

DataBits

獲取或設定每個位元組的標準資料位長度

Parity

獲取或設定奇偶校驗檢查協議

StopBits

獲取或設定每個位元組的標準停止位數

2。 常用方法:

名稱

說明

Close

關閉埠連線,將 IsOpen 屬性設定為

false

,並釋放內部 Stream 物件

GetPortNames

獲取當前計算機的串列埠名稱陣列

Open

開啟一個新的串列埠連線

Read

SerialPort

輸入緩衝區中讀取

Write

將資料寫入串列埠輸出緩衝區

3。 常用事件:

名稱

說明

DataReceived

表示將處理

SerialPort

物件的資料接收事件的方法

三、C#開發串列埠例項

前臺頁面:

C#開發串列埠通訊例項及串列埠基礎

後臺程式碼:

C#開發串列埠通訊例項及串列埠基礎

using System;using System。IO。Ports;using System。Text;using System。Windows。Forms;namespace SerialPort{ public partial class SerialPort : Form { String serialPortName; public SerialPort() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { string[] ports = System。IO。Ports。SerialPort。GetPortNames();//獲取電腦上可用串列埠號 comboBox1。Items。AddRange(ports);//給comboBox1新增資料 comboBox1。SelectedIndex = comboBox1。Items。Count > 0 ? 0 : -1;//如果裡面有資料,顯示第0個 comboBox2。Text = “115200”;/*預設波特率:115200*/ comboBox3。Text = “1”;/*預設停止位:1*/ comboBox4。Text = “8”;/*預設資料位:8*/ comboBox5。Text = “無”;/*預設奇偶校驗位:無*/ } private void button1_Click(object sender, EventArgs e) { if (button1。Text == “開啟串列埠”){//如果按鈕顯示的是開啟 try{//防止意外錯誤 serialPort1。PortName = comboBox1。Text;//獲取comboBox1要開啟的串列埠號 serialPortName = comboBox1。Text; serialPort1。BaudRate = int。Parse(comboBox2。Text);//獲取comboBox2選擇的波特率 serialPort1。DataBits = int。Parse(comboBox4。Text);//設定資料位 /*設定停止位*/ if (comboBox3。Text == “1”) { serialPort1。StopBits = StopBits。One; } else if (comboBox3。Text == “1。5”) { serialPort1。StopBits = StopBits。OnePointFive; } else if (comboBox3。Text == “2”) { serialPort1。StopBits = StopBits。Two; } /*設定奇偶校驗*/ if (comboBox5。Text == “無”) { serialPort1。Parity = Parity。None; } else if (comboBox5。Text == “奇校驗”) { serialPort1。Parity = Parity。Odd; } else if (comboBox5。Text == “偶校驗”) { serialPort1。Parity = Parity。Even; } serialPort1。Open();//開啟串列埠 button1。Text = “關閉串列埠”;//按鈕顯示關閉串列埠 } catch (Exception err) { MessageBox。Show(“開啟失敗”+ err。ToString(), “提示!”);//對話方塊顯示開啟失敗 } } else{//要關閉串列埠 try{//防止意外錯誤 serialPort1。Close();//關閉串列埠 } catch (Exception){} button1。Text = “開啟串列埠”;//按鈕顯示開啟 } } protected override void WndProc(ref Message m) { if (m。Msg == 0x0219){//裝置改變 if (m。WParam。ToInt32() == 0x8004){//usb串列埠拔出 string[] ports = System。IO。Ports。SerialPort。GetPortNames();//重新獲取串列埠 comboBox1。Items。Clear();//清除comboBox裡面的資料 comboBox1。Items。AddRange(ports);//給comboBox1新增資料 if (button1。Text == “關閉串列埠”){//使用者開啟過串列埠 if (!serialPort1。IsOpen){//使用者開啟的串列埠被關閉:說明熱插拔是使用者開啟的串列埠 button1。Text = “開啟串列埠”; serialPort1。Dispose();//釋放掉原先的串列埠資源 comboBox1。SelectedIndex = comboBox1。Items。Count > 0 ? 0 : -1;//顯示獲取的第一個串列埠號 } else{ comboBox1。Text = serialPortName;//顯示使用者開啟的那個串列埠號 } } else{//使用者沒有開啟過串列埠 comboBox1。SelectedIndex = comboBox1。Items。Count > 0 ? 0 : -1;//顯示獲取的第一個串列埠號 } } else if (m。WParam。ToInt32() == 0x8000){//usb串列埠連線上 string[] ports = System。IO。Ports。SerialPort。GetPortNames();//重新獲取串列埠 comboBox1。Items。Clear(); comboBox1。Items。AddRange(ports); if (button1。Text == “關閉串列埠”){//使用者開啟過一個串列埠 comboBox1。Text = serialPortName;//顯示使用者開啟的那個串列埠號 } else{ comboBox1。SelectedIndex = comboBox1。Items。Count > 0 ? 0 : -1;//顯示獲取的第一個串列埠號 } } } base。WndProc(ref m); } private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { int len = serialPort1。BytesToRead;//獲取可以讀取的位元組數 byte[] buff = new byte[len];//建立快取資料陣列 serialPort1。Read(buff, 0, len);//把資料讀取到buff陣列 Invoke((new Action(() =>{//C# 3。0以後代替委託的新方法 textBox1。AppendText(Encoding。Default。GetString(buff));//對話方塊追加顯示資料 }))); } private void button2_Click(object sender, EventArgs e) { textBox1。Clear();//清除接收對話方塊顯示的資料 } private void button3_Click(object sender, EventArgs e) { String Str = textBox2。Text。ToString();//獲取傳送文字框裡面的資料 try { if (Str。Length > 0) { serialPort1。Write(Str);//串列埠傳送資料 } } catch (Exception){ } } private void button4_Click(object sender, EventArgs e) { textBox2。Clear();//清除傳送文字框裡面的內容 } }}

C#開發串列埠通訊例項及串列埠基礎

Top