在C#中使用SerialPort類實現串口通訊(陸續更新)

來源:互聯網
上載者:User

標籤:style   blog   http   io   ar   color   os   使用   sp   

在.NET Framework 2.0中提供了SerialPort類,該類主要實現串口資料通訊等。本文章將本人在學習過程中從網路上搜集到的相關資訊寫出來供大家參考。下面主要介紹該類的主要屬性(表1)和方法(表.2)。如果需要瞭解更多的資訊請登入http://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport(VS.80).aspx查看。相關文章《使用System.IO.Ports讀取COM口資料》http://www.devasp.net/net/articles/display/727.html  表1                                                      SerialPort類的常用屬性名稱  稱 說  明 BaseStream 擷取 SerialPort 對象的基礎 Stream 對象 BaudRate 擷取或設定串列傳輸速率 BreakState 擷取或設定中斷訊號狀態 BytesToRead 擷取接收緩衝區中資料的位元組數 BytesToWrite 擷取發送緩衝區中資料的位元組數 CDHolding 擷取連接埠的偵測載波行的狀態 CtsHolding 擷取“可以發送”行的狀態 DataBits 擷取或設定每個位元組的標準資料位元長度 DiscardNull 擷取或設定一個值,該值指示 Null 位元組在連接埠和接收緩衝區之間傳輸時是否被忽略 DsrHolding 擷取資料設定就緒 (DSR) 訊號的狀態 DtrEnable 擷取或設定一個值,該值在串列通訊過程中啟用資料終端機就緒 (DTR) 訊號 Encoding 擷取或設定傳輸前後文本轉換的位元組編碼 Handshake 擷取或設定序列埠資料轉送的握手協議 IsOpen 擷取一個值,該值指示 SerialPort 對象的開啟或關閉狀態 NewLine 擷取或設定用於解釋 ReadLine( )和WriteLine( )方法調用結束的值 Parity 擷取或設定同位檢查協議 續表名  稱 說  明 ParityReplace 擷取或設定一個位元組,該位元組在發生同位錯誤時替換資料流中的無效位元組 PortName 擷取或設定通訊連接埠,包括但不限於所有可用的 COM 連接埠 ReadBufferSize 擷取或設定 SerialPort 輸入緩衝區的大小 ReadTimeout 擷取或設定讀取操作未完成時發生逾時之前的毫秒數 ReceivedBytesThreshold 擷取或設定 DataReceived 事件發生前內部輸入緩衝區中的位元組數 RtsEnable 擷取或設定一個值,該值指示在串列通訊中是否啟用請求發送 (RTS) 訊號 StopBits 擷取或設定每個位元組的標準停止位元 WriteBufferSize 擷取或設定序列埠輸出緩衝區的大小 WriteTimeout 擷取或設定寫入操作未完成時發生逾時之前的毫秒數 表2                                                     SerialPort類的常用方法方 法 名 稱 說  明 Close 關閉連接埠串連,將 IsOpen 屬性設定為False,並釋放內部 Stream 對象 Open 開啟一個新的序列埠串連 Read 從 SerialPort 輸入緩衝區中讀取 ReadByte 從 SerialPort 輸入緩衝區中同步讀取一個位元組 ReadChar 從 SerialPort 輸入緩衝區中同步讀取一個字元 ReadLine 一直讀取到輸入緩衝區中的 NewLine 值 ReadTo 一直讀取到輸入緩衝區中指定 value 的字串 Write 已重載。將資料寫入序列埠輸出緩衝區 WriteLine 將指定的字串和 NewLine 值寫入輸出緩衝區  使用SerialPort類的方法:方法一:首先要添加using System.IO;using System.IO.Ports;1...在類的內部定義SerialPort com;2...開啟串口            com = new SerialPort();            com.BaudRate = 115200;            com.PortName = "COM1";            com.DataBits = 8;            com.Open();//開啟串口3...發送資料            Byte[] TxData ={1,2,3,4,5,6,7,8 };            com.Write(TxData, 0, 8);4...接收資料     4.1使用事件接收     this.com.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.OnDataReceived);private void OnDataReceived(object sender, SerialDataReceivedEventArgs e)    4.2使用線程接收     接收資料啟動一個線程,使其接收。在類的內部定義        Thread _readThread;        bool _keepReading;開啟串口後啟動線程            _keepReading = true;            _readThread = new Thread(ReadPort);            _readThread.Start();線程函數[c-sharp] view plaincopy01.private void ReadPort()  02.{  03.    while (_keepReading)  04.    {  05.        if (com.IsOpen)  06.        {  07.            byte[] readBuffer = new byte[com.ReadBufferSize + 1];  08.            try  09.            {  10.                // If there are bytes available on the serial port,  11.                // Read returns up to "count" bytes, but will not block (wait)  12.                // for the remaining bytes. If there are no bytes available  13.                // on the serial port, Read will block until at least one byte  14.                // is available on the port, up until the ReadTimeout milliseconds  15.                // have elapsed, at which time a TimeoutException will be thrown.  16.                int count = com.Read(readBuffer, 0, com.ReadBufferSize);  17.                String SerialIn = System.Text.Encoding.ASCII.GetString(readBuffer, 0, count);  18.                if (count != 0)  19.                    //byteToHexStr(readBuffer);  20.                    ThreadFunction(byteToHexStr(readBuffer,count));  21.            }  22.            catch (TimeoutException) { }  23.        }  24.        else  25.        {  26.            TimeSpan waitTime = new TimeSpan(0, 0, 0, 0, 50);  27.            Thread.Sleep(waitTime);  28.        }  29.    }  30.}    方法二:使用C#內建的SerialPor控制項。1...在“工具箱”的“組件”中選擇SerialPor控制項添加。2...設定串口並開啟serialPort1.PortName = "COM1";serialPort1.BaudRate = 9600;serialPort1.Open();3...寫入資料可以使用Write或者下面的函數serialPort1.WriteLine(str);4...添加資料接收的事件private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 使用中的一些常見問題C#中SerialPort類中DataReceived事件GUI即時處理方法(來自[email protected] 的看法)MSDN:從 SerialPort 對象接收資料時,將在輔助線程上引發 DataReceived 事件。由於此事件在輔助線程而非主線程上引發,因此嘗試修改主線程中的一些元素(如 UI 元素)時會引發線程異常。如果有必要修改主 Form 或 Control 中的元素,必須使用 Invoke 回傳變更要求,這將在正確的線程上執行.進而要想將輔助線程中所讀到的資料顯示到主線程的Form控制項上時,只有通過Invoke方法來實現 下面是代碼執行個體: [c-sharp] view plaincopy01.private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)  02.{  03.   int SDateTemp = this.serialPort1.ReadByte();  04.   //讀取串口中一個位元組的資料  05.   this.tB_ReceiveDate.Invoke(     06.    //在擁有此控制項的基礎視窗控制代碼的線程上執行委託Invoke(Delegate)  07.    //即在textBox_ReceiveDate控制項的父視窗form中執行委託.  08.    new MethodInvoker(              09.    /*表示一個委託,該委託可執行Managed 程式碼中聲明為 void 且不接受任何參數的任何方法。 在對控制項的 Invoke    方法進行調用時或需要一個簡單委託又不想自己定義時可以使用該委託。*/  10.    delegate{                   11.    /*匿名方法,C#2.0的新功能,這是一種允許程式員將一段完整代碼區塊當成參數傳遞的程式碼編寫技術,通過此種方法可  以直接使用委託來設計事件響應程式以下就是你要在主線程上實現的功能但是有一點要注意,這裡不適宜處理過多的方法,因為C#訊息機制是訊息流程水線響應機制,如果這裡在主線程上處理語句的時間過長會導致主UI線程阻塞,停止回應或響應不順暢,這時你的主form介面會延遲或卡死      */                     12.    this.tB_ReceiveDate.AppendText(SDateTemp.ToString());//輸出到主視窗文本控制項  13.    this.tB_ReceiveDate.Text += " ";}  14.    )  15.    );  16.}    如何知道當前電腦有哪個串口在表單上添加一個comboBox控制項。然後使用comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames());  或者 string[] portList = System.IO.Ports.SerialPort.GetPortNames();            for (int i = 0; i < portList.Length; ++i)            {                string name = portList[i];                comboBox1.Items.Add(name);            } 具體請參考http://msdn.microsoft.com/zh-tw/library/system.io.ports.serialport.getportnames.aspx

 

在C#中使用SerialPort類實現串口通訊(陸續更新)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.