日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#中串口通信编程 收藏

發布時間:2025/3/15 C# 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#中串口通信编程 收藏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C#中串口通信編程 收藏

本文將介紹如何在.NET平臺下使用C#創建串口通信程序,.NET 2.0提供了串口通信的功能,其命名

空間是System.IO.Ports。這個新的框架不但可以訪問計算機上的串口,還可以和串口設備進行通信。

我們將使用標準的RS 232 C 在PC間通信。它工作在全雙工模式下,而且我們不打算使用任何的握手

或流控制器,而是使用無modem連接。

命名空間

System.IO.Ports命名空間中最重用的是SerialPort 類。

創建SerialPort 對象

通過創建SerialPort 對象,我們可以在程序中控制串口通信的全過程。

我們將要用到的SerialPort 類的方法:

ReadLine():從輸入緩沖區讀一新行的值,如果沒有,會返回NULL

WriteLine(string):寫入輸出緩沖

Open():打開一個新的串口連接

Close():關閉

Code:

//create a Serial Port object

SerialPort sp = new SerialPort ();

默認情況下,DataBits 值是8,StopBits 是1,通信端口是COM1。這些都可以在下面的屬性中重新設置

BaudRate:串口的波特率

StopBits:每個字節的停止位數量

ReadTimeout:當讀操作沒有完成時的停止時間。單位,毫秒

還有不少其它公共屬性,自己查閱MSDN。

串口的硬件知識

在數據傳輸的時候,每個字節的數據通過單個的電纜線傳輸。包包括開始位,數據,結束為。一旦

開始位傳出,后面就會傳數據,可能是5,6,7或8位,就看你的設定了。發送和接收必須設定同樣

的波特率和數據位數。

無貓模式

沒有Modem模式的電纜只是簡單地交叉傳送和接收線。同樣DTR & DSR, 和 RTS & CTS也需要交叉。

RS232針圖

這里,我們三條線。互連2和3(一段的2pin連接3pin),連接兩端的5pin。

[示例程序]

主程序

如果想使用默認屬性,按“Save Status”按鈕,如果想改變屬性按“Property”。它會彈出下圖:

設定好之后,可以通信了。

主窗口的代碼

Code:

#region Using directives

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Windows.Forms;

using System.IO.Ports;

#endregion

namespace Serialexpample

{

??? partial class Form1 : Form

??? {

??????? //create instance of property page

??????? //property page is used to set values for stop bits and

??????? //baud rate

??????? PropertyPage pp = new PropertyPage();

??????? //create an Serial Port object

??????? SerialPort sp = new SerialPort();

??????? public Form1()

??????? {

??????????? InitializeComponent();

??????? }

???????????

??????? private void propertyButton_Click(object sender, EventArgs e)

??????? {

??????????? //show property dialog

??????????? pp.ShowDialog();

??????????? propertyButton.Hide();

??????? }

??????? private void sendButton_Click(object sender, EventArgs e)

??????? {

??????????? try

??????????? {

??????????????? //write line to serial port

??????????????? sp.WriteLine(textBox.Text);

??????????????? //clear the text box

??????????????? textBox.Text = "";

??????????? }

??????????? catch (System.Exception ex)

??????????? {

??????????????? baudRatelLabel.Text = ex.Message;

??????????? }

??????? }

??????? private void ReadButton_Click(object sender, EventArgs e)

??????? {

??????????? try

??????????? {

??????????????? //clear the text box

????????????? ??textBox.Text = "";

??????????????? //read serial port and displayed the data in text box

??????????????? textBox.Text = sp.ReadLine();

??????????? }

??????????? catch(System.Exception ex)

??????????? {

??????????????? baudRatelLabel.Text = ex.Message;

? ??????????}

??????? }

??????? private void Form1_Load(object sender, EventArgs e)

??????? {

??????? }

??????? private void Form1_FormClosing(object sender, FormClosingEventArgs e)

??????? {

??????????? MessageBox.Show("Do u want to Close the App");

?????? ?????sp.Close();

??????? }

??????? private void startCommButton_Click(object sender, EventArgs e)

??????? {

??????????? startCommButton.Hide();

??????????? sendButton.Show();

??????????? readButton.Show();

??????????? textBox.Show();

??????? }

??????? //when we want to save the status(value)

??????? private void saveStatusButton_Click_1(object sender, EventArgs e)

??????? {

??????????? //display values

??????????? //if no property is set the default values

??????????? if (pp.bRate == "" && pp.sBits == "")

??????????? {

??????????????? dataBitLabel.Text = "BaudRate = " + sp.BaudRate.ToString();

??????????????? readTimeOutLabel.Text = "StopBits = " + sp.StopBits.ToString();

??????????? }

??????????? else

??????????? {

??????????????? dataBitLabel.Text = "BaudRate = " + pp.bRate;

??????????????? readTimeOutLabel.Text = "StopBits = " + pp.sBits;

??????????? }

??????????? parityLabel.Text = "DataBits = " + sp.DataBits.ToString();

??????????? stopBitLabel.Text = "Parity = " + sp.Parity.ToString();

??????????? readTimeOutLabel.Text = "ReadTimeout = " +

????????????????????? sp.ReadTimeout.ToString();

??????????? if (propertyButton.Visible == true)

??????????????? propertyButton.Hide();

??????????? saveStatusButton.Hide();

??????????? startCommButton.Show();

??????? ????try

??????????? {

??????????????? //open serial port

??????????????? sp.Open();

??????????????? //set read time out to 500 ms

??????????????? sp.ReadTimeout = 500;

??????????? }

??????????? catch (System.Exception ex)

??????????? {

??????????????? baudRatelLabel.Text = ex.Message;

??????????? }

??????? }

??? }

}

屬性設置對話框代碼:

Code:

#region Using directives

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

#endregion

namespace Serialexpample

{

??? partial class PropertyPage : Form

??? {

??????? //variables for storing values of baud rate and stop bits

??????? private string baudR="";

??????? private string stopB="";

??????? //property for setting and getting baud rate and stop bits

??????? public string bRate

??????? {

??????????? get

??????????? {

??????????????? return baudR;

??????????? }

??????????? set

??????????? {

??????????????? baudR = value;

??????????? }

??????? }

??????? public string sBits

??????? {

??????????? get

??????????? {

????????????? ??return stopB;

??????????? }

??????????? set

??????????? {

??????????????? stopB = value;

??????????? }

??????? }

??????? public PropertyPage()

??????? {

??????????? InitializeComponent();

??????? }

??????? private void cancelButton_Click(object sender, EventArgs e)

??????? {

??????????? this.bRate = "";

??????????? this.sBits = "";

??????????? //close form

??????????? this.Close();

??????? }

??????? private void okButton_Click_1(object sender, EventArgs e)

??????? {

??????????? //here we set the value for stop bits and baud rate.

??????????? this.bRate = BaudRateComboBox.Text;

??????????? this.sBits = stopBitComboBox.Text;

??????????? //

??????????? this.Close();

??????? }

??? }

}

?

一.概述

在Visual Studio 6.0中編寫串口通訊程序,一般都使用Microsoft Communication Control(簡稱MSComm)的通訊控件,只要通 過對此控件的屬性和事件進行相應編程操作,就可以輕松地實現串口通訊。但在Microsoft.Net技術廣泛應用的今天,Visual Studio.Net沒有將此控件加入控件庫,所以人們采用了許多方法在Visual Studio.Net來編寫串口通訊程序:第一種方法是通過采用Visual Studio 6.0中原來的MSComm控件這是最簡單的,最方便的方法,但需要注冊;第二種方法是采用微軟在.NET推出了一個串口控件,基于.NET的P/Invoke調用方法實現;第三種方法是自己用API寫串口通信,雖然難度高,但可以方便實現自己想要的各種功能。

現在微軟推出了最新版本的Visual Studio 2005開發工具,可以不再采用第三方控件的方法來設計串口通訊程序。NET Framework 2.0 類庫包含了SerialPort 類,方便地實現了所需要串口通訊的多種功能,為了使MSComm編程方法快速轉換到以SerialPort類為核心的串口通訊的設計方法,本文著重討論了Visual Studio 6.0的MSComm控件和SerialPort 類設計方法的異同點。

二.SerialPort常用屬性、方法和事件

1.命名空間

System.IO.Ports命名空間包含了控制串口重要的SerialPort類,該類提供了同步 I/O 和事件驅動的 I/O、對管腳和中斷狀態的訪問以及對串行驅動程序屬性的訪問,所以在程序代碼起始位置需加入Using System.IO.Ports。

2.串口的通訊參數

串口通訊最常用的參數就是通訊端口號及通訊格式(波特率、數據位、停止位和校驗位),在MSComm中相關的屬性是CommPort和Settings。SerialPort類與MSComm有一些區別:

a.通訊端口號

[PortName]屬性獲取或設置通信端口,包括但不限于所有可用的 COM 端口,請注意該屬性返回類型為String,不是Mscomm.CommPort的short類型。通常情況下,PortName正常返回的值為COM1、COM2……,SerialPort類最大支持的端口數突破了CommPort控件中CommPort屬性不能超過16的限止,大大方便了用戶串口設備的配置。

b. 通訊格式

SerialPort類對分別用[BaudRate]、[Parity]、[DataBits]、[StopBits]屬性設置通訊格式中的波特率、數據位、停止位和校驗位,其中[Parity]和[StopBits]分別是枚舉類型Parity、StopBits,Parity類型中枚舉了Odd(奇)、Even(偶)、Mark、None、Space,Parity枚舉了None、One、OnePointFive、Two。

SerialPort類提供了七個重載的構造函數,既可以對已經實例化的SerialPort對象設置上述相關屬性的值,也可以使用指定的端口名稱、波特率和奇偶校驗位數據位和停止位直接初始化 SerialPort 類的新實例。

3.串口的打開和關閉

SerialPort類沒有采用MSComm.PortOpen=True/False設置屬性值打開關閉串口,相應的是調用類的Open()和Close()方法。

4. 數據的發送和讀取

Serial類調用重載的Write和WriteLine方法發送數據,其中WriteLine可發送字符串并在字符串末尾加入換行符,讀取串口緩沖區的方法有許多,其中除了ReadExisting和ReadTo,其余的方法都是同步調用,線程被阻塞直到緩沖區有相應的數據或大于ReadTimeOut屬性設定的時間值后,引發ReadExisting異常。

5.DataReceived事件

該事件類似于MSComm控件中的OnComm事件,DataReceived事件在接收到了[ReceivedBytesThreshold]設置的字符個數或接收到了文件結束字符并將其放入了輸入緩沖區時被觸發。其中[ReceivedBytesThreshold]相當于MSComm控件的[Rthreshold]屬性,該事件的用法與MsComm控件的OnComm事件在CommEvent為comEvSend和comEvEof時是一致的。? ?

三.SerialPort的使用

對于熟悉MSComm控件的程序設計者,SerialPort類是相當容易上手的。在進行串口通訊時,一般的流程是設置通訊端口號及波特率、數據位、停止位和校驗位,再打開端口連接,發送數據,接收數據,最后關閉端口連接這樣幾個步驟。

數據接收的設計方法在這里比較重要,采用輪詢的方法比較浪費時間,在Visual Basic中的延時方法中一般會調用API并用DOEvents方法來處理,但程序不易控制,建議采用DataReceived事件觸發的方法,合理的設置ReceivedBytesThreshold的值,若接收的是定長的數據,則將ReceivedBytesThreshold設為接收數據的長度,若接收數據的結尾是固定的字符或字符串則可采用ReadTo的方法或在DataReceived事件中判斷接收的字符是否滿足條件。

SerialPort類讀取數據的許多方法是同步阻塞調用,盡量避免在主線程中調用,可以使用異步處理或線程間處理調用這些讀取數據的方法。

由于DataReceived事件在輔線程被引發,當收到完整的一條數據,返回主線程處理或在窗體上顯示時,請注意跨線程的處理,C#可采用控件異步委托的方法Control.BeginInvoke及同步委托的方法Invoke。

四.結束語

在.NET平臺下熟練使用SerialPort 類,可以很好地開發出串口通訊類程序,對于過去使用MSComm控件設計了一些通訊程序,也可以將MSComm控件替換為SerialPort類,當然為了避免對以前的項目做大的改動,可以使用SerialPort類設計一些與MSComm控件具有相同接口的類,在今后工業控制中,SerialPort類將廣泛地應用于串口通訊程序的設計中,發揮著與MSComm控件一樣的作用。

2.以類的方式

?? VB:

1)???????? 定義SerialPort類實例

????? Dim SpCom As New System.IO.Ports.SerialPort()

2)???????? 設置通訊端口號及波特率、數據位、停止位和校驗位。

??????? SpCom.PortName = "COM1"

??????? SpCom.BaudRate = 9600

??????? SpCom.Parity = IO.Ports.Parity.None

??????? SpCom.DataBits = 8

??????? SpCom.StopBits = IO.Ports.StopBits.One

??????? 或是定義時直接初始化

???????? Dim SpCom As New System.IO.Ports.SerialPort("COM1", 9600, IO.Ports.Parity.Even, 8,?

??????? IO.Ports.StopBits.None)

3)???????? 發送數據

???? SpCom.Write(TextSendData.Text)

4)?????? ??添加接受事件

a)??????? 在運行時將事件與事件處理程序相關聯

AddHandler SpCom.DataReceived, AddressOf EventReceiveData

說明:

AddressOf 創建引用特定過程的過程委托實例

AddressOf 運算符可以用作委托構造函數的操作數,或可以用在編譯器能夠確定委???? 托類型的上下文中。

b)??????? 添加事件處理程序(簽名一定要一致)

????????????? Sub EventReceiveData(ByVal sender As Object, ByVal e As

??????????? System.IO.Ports.SerialDataReceivedEventArgs)

5)???????? 讀取數據

??????? Dim strT As String

???? strT = SpCom.ReadExisting()

C#:

1)???????? 添加引用

???? using System.IO.Ports;

2)???????? 定義SerialPort類實例

????? private SerialPort SpCom2 = new SpCom ("COM2", 9600,Parity.None, 8, StopBits.One);

3)???????? 設置通訊端口號及波特率、數據位、停止位和校驗位。

??????? SpCom.PortName = "COM1";

??????? SpCom.BaudRate = 9600;

??????? SpCom.Parity = IO.Ports.Parity.None;

??????? SpCom.DataBits = 8;

??????? SpCom.StopBits = IO.Ports.StopBits.One;

??????? 或是定義時直接初始化

???????? private SerialPort SpCom2 = new SpCom ("COM2", 9600,Parity.None, 8, StopBits.One);

4)???????? 發送數據

???? SpCom.Write(TextSendData.Text);

5)???????? 添加接受事件

a)??????? 在運行時將事件與事件處理程序相關聯(通過委托實現)

SpCom.DataReceived += new SerialDataReceivedEventHandler(SpCom2_DataReceived);

說明:

SerialDataReceivedEventHandler 委托 表示將處理 SerialPort 對象的 DataReceived 事件的方法

b)??????? 添加事件處理程序(簽名一定要一致)

????????????? private void SpCom_DataReceived(object sender, SerialDataReceivedEventArgs e)

6)???????? 讀取數據

??????? string data = SpCom .ReadExisting();

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/shengyongwang/archive/2009/05/19/4202154.aspx

usingSystem;
usingSystem.IO.Ports;
usingSystem.Threading;
?
publicclass PortChat
{
?????staticbool _continue;
?????static SerialPort _serialPort;

??????publicstaticvoid Main()
?????{
?????????string name;
?????????stringmessage;
?????????StringComparer stringComparer = StringComparer.OrdinalIgnoreCase;
?????????Thread readThread =newThread(Read);

??????????// Create a new SerialPort object with default settings.

??????????_serialPort =new SerialPort();

??????????// Allow the user to set the appropriate properties.

??????????_serialPort.PortName = SetPortName(_serialPort.PortName);
?????????_serialPort.BaudRate = SetPortBaudRate(_serialPort.BaudRate);
?????????_serialPort.Parity = SetPortParity(_serialPort.Parity);
?????????_serialPort.DataBits = SetPortDataBits(_serialPort.DataBits);
?????????_serialPort.StopBits = SetPortStopBits(_serialPort.StopBits);
?????????_serialPort.Handshake = SetPortHandshake(_serialPort.Handshake);

??????????// Set the read/write timeouts

??????????_serialPort.ReadTimeout = 500;
?????????_serialPort.WriteTimeout = 500;

??????????_serialPort.Open();
?????????_continue =true;
?????????readThread.Start();

??????????Console.Write("Name: ");
?????????name =Console.ReadLine();

??????????Console.WriteLine("Type QUIT to exit");

??????????while(_continue)
?????????{
?????????????message=Console.ReadLine();

??????????????if(stringComparer.Equals("quit",message))
?????????????{
?????????????????_continue =false;
?????????????}
?????????????else
??????????????{
?????????????????_serialPort.WriteLine(
?????????????????????String.Format("<{0}>: {1}", name,message));
?????????????}
?????????}

??????????readThread.Join();
?????????_serialPort.Close();
?????}

??????publicstaticvoid Read()
?????{
?????????while(_continue)
?????????{
?????????????try
??????????????{
?????????????????stringmessage= _serialPort.ReadLine();
?????????????????Console.WriteLine(message);
?????????????}
?????????????catch(TimeoutException){}
?????????}
?????}

??????publicstaticstring SetPortName(string defaultPortName)
?????{
?????????string portName;

??????????Console.WriteLine("Available Ports:");
?????????foreach(string s in SerialPort.GetPortNames())
?????????{
?????????????Console.WriteLine(" {0}", s);
?????????}

??????????Console.Write("COM port({0}): ", defaultPortName);
?????????portName =Console.ReadLine();

??????????if(portName =="")
?????????{
?????????????portName = defaultPortName;
?????????}
?????????return portName;
?????}

??????publicstaticint SetPortBaudRate(int defaultPortBaudRate)
?????{
?????????string baudRate;

??????????Console.Write("Baud Rate({0}): ", defaultPortBaudRate);
?????????baudRate =Console.ReadLine();

??????????if(baudRate =="")
?????????{
?????????????baudRate = defaultPortBaudRate.ToString();
?????????}

??????????returnint.Parse(baudRate);
?????}

??????publicstatic Parity SetPortParity(Parity defaultPortParity)
?????{
?????????string parity;

??????????Console.WriteLine("Available Parity options:");
?????????foreach(string s inEnum.GetNames(typeof(Parity)))
?????????{
?????????????Console.WriteLine(" {0}", s);
?????????}

??????????Console.Write("Parity({0}):", defaultPortParity.ToString());
?????????parity =Console.ReadLine();

??????????if(parity =="")
?????????{
?????????????parity = defaultPortParity.ToString();
?????????}

??????????return(Parity)Enum.Parse(typeof(Parity), parity);
?????}

??????publicstaticint SetPortDataBits(int defaultPortDataBits)
?????{
?????????string dataBits;

??????????Console.Write("Data Bits({0}): ", defaultPortDataBits);
?????????dataBits =Console.ReadLine();

??????????if(dataBits =="")
?????????{
?????????????dataBits = defaultPortDataBits.ToString();
?????????}

??????????returnint.Parse(dataBits);
?????}
?????
?????publicstatic StopBits SetPortStopBits(StopBits defaultPortStopBits)
?????{
?????????string stopBits;

??????????Console.WriteLine("Available Stop Bits options:");
?????????foreach(string s inEnum.GetNames(typeof(StopBits)))
?????????{
?????????????Console.WriteLine(" {0}", s);
?????????}

??????????Console.Write("Stop Bits({0}):", defaultPortStopBits.ToString());
?????????stopBits =Console.ReadLine();

??????????if(stopBits =="")
?????????{
?????????????stopBits = defaultPortStopBits.ToString();
?????????}

??????????return(StopBits)Enum.Parse(typeof(StopBits), stopBits);
?????}

??????publicstatic Handshake SetPortHandshake(Handshake defaultPortHandshake)
?????{
?????????string handshake;

??????????Console.WriteLine("Available Handshake options:");
?????????foreach(string s inEnum.GetNames(typeof(Handshake)))
?????????{
?????????????Console.WriteLine(" {0}", s);
?????????}

??????????Console.Write("Stop Bits({0}):", defaultPortHandshake.ToString());
?????????handshake =Console.ReadLine();

??????????if(handshake =="")
?????????{
?????????????handshake = defaultPortHandshake.ToString();
?????????}

??????????return(Handshake)Enum.Parse(typeof(Handshake), handshake);
?????}
}

?

總結

以上是生活随笔為你收集整理的C#中串口通信编程 收藏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 制服丝袜先锋 | 丰满少妇高潮一区二区 | 日本福利视频导航 | 久久久久亚洲av成人人电影 | 精品久久国产视频 | 婷婷成人在线 | 草草网址 | 最新一区二区三区 | 男女裸体无遮挡做爰 | 麻豆视频国产 | 亚洲第一色站 | 国产成人综合一区二区三区 | 日韩欧美中文字幕一区 | 日韩精品一区二区三区久久 | 激情国产在线 | 人妻丰满熟妇av无码区 | 999超碰| 亚洲欧洲日产av | 亚洲一区和二区 | 蜜桃中文字幕 | 国产欧美一级片 | 成人av一区二区三区 | 日韩一区二区三区四区五区 | 国产欧美一区二区三区视频在线观看 | 亚洲丝袜视频 | 欧洲一区在线 | 人人超碰人人 | 国产乱码精品一品二品 | 国产成人精品无码播放 | 丰满少妇高潮一区二区 | 欧美操老女人 | 免费视频污 | 91禁蘑菇在线看 | 日韩av影视大全 | 在线看亚洲| 久久久免费精品 | 国产午夜电影 | 桃花色综合影院 | 国产精品无码av无码 | 午夜影院视频 | 欧美日韩观看 | 97影院手机版 | 超碰在线91| av黄色免费网站 | 男生桶女生肌肌 | 日本www网站 | 婷婷午夜精品久久久久久性色av | 亚洲狠狠 | 91 在线观看 | 欧美色图1 | 欧美日韩一区二区在线播放 | 91老肥熟 | 深夜福利网址 | 午夜美女网站 | 免费网站av | 久久97视频 | 日韩在线你懂的 | 毛片看| 日少妇的逼 | 在线精品福利 | 欧美无极品 | 欧美人体一区二区三区 | 日本aa大片| 日本三级网站在线观看 | 亚洲一区二区三区视频 | 久久免费视频网站 | 欧美拍拍| 亚洲交性网 | 91久久一区二区 | 日韩精品免费电影 | 少妇被按摩师摸高潮了 | 欧美天天搞 | 超碰2023| 欧美成人精品一区 | 精品乱子伦一区二区 | 国产精品久久久久久妇女6080 | av网站大全免费 | 亚州av片| 成人动漫免费在线观看 | 精品欧美激情精品一区 | 在线欧美一区 | 欧美激情伊人 | 欧美男人的天堂 | 激情网站免费 | 日韩一区中文 | 91黑丝在线观看 | 中文字幕精品视频 | 少妇人妻偷人精品无码视频 | 欧美日韩亚洲一区二区 | 日日草夜夜草 | a一级免费视频 | 国精产品99永久一区一区 | 97性视频 | www.超碰在线.com | 少妇荡乳情欲办公室456视频 | 婷婷黄色网 | 男人天堂亚洲天堂 | 色中文在线 | 中文字幕av久久爽一区 |