C#串口通信程序SerialPort類

上篇文章主要是關於串口通信中單片機部分的程序編寫。在實際應用中,常常還要有上位機的配合才能完成工作。寫串口通信的上位機程序,常常應用的編程語言有C++,VB,C#等。VB沒有學過,C++編寫窗口應用程序接觸也不多,暑假自己看了一些C#的書,也有了一些瞭解,所以就用C#寫窗口應用程序,用來作上位PC機的串口通信程序。在寫的過程中,主要參見了這篇博客http://blog.csdn.net/wuyazhe/article/details/5598945,感謝這位博主。

C#中的串口通信編程主要用到了SerialPort類,它位於命名空間System.IO.Ports下,所以在程序開始要包含這個命名空間。

先上運行時的窗口界面,很簡陋,也只實現了收發的基本的功能,但是可以在這個上面擴充。



由於註釋寫的比較詳細,所以下面的程序一般只貼出了代碼。

 

成員變量有兩個,一個是C#提供的SerialPort類,是物理上的串口在程序中的映射。

另一個爲可變字符串類型StringBuilder,用於字符串的處理。

         //串口類
        private SerialPort comm = new SerialPort();
        //可變字符串類,用於存儲接收到的字符
        private StringBuilder Builder = new StringBuilder();



 

Form窗口的Load事件響應方法

  //註冊窗口初始化事件
        private void Form1_Load_1(object sender, EventArgs e)
        {
            
#region 初始化下拉串口名稱列表框

            //獲取單片機與計算機連接的端口號
            string[] ports = SerialPort.GetPortNames();   
            Array.Sort(ports);
            
            //將其顯示到comboPorName控件中去
            comboPortName.Items.AddRange(ports);
            comboPortName.SelectedIndex = comboPortName.Items.Count > 0 ? 0 : -1;
           
            //波特率默認爲9600bps,可以通過下拉選項進行調節
            comboPortBaudrate.SelectedIndex = comboPortBaudrate.Items.IndexOf("9600");

#endregion
            
            //下面這句還不太懂,先照着做
            comm.NewLine = "\r\n";

            //與設置RTS信號有關,雖不明,但覺厲,照着做
            comm.RtsEnable = true;

            //註冊對串口接收數據的響應方法
            comm.DataReceived += new SerialDataReceivedEventHandler(comm_DataReceived);
       
        }

接收數據的響應方法
 void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //獲取接收緩衝區中數據的字節數
            int n = comm.BytesToRead;
            byte[] buf = new byte[n];
            
            //將數據讀入buf數組中
            comm.Read(buf, 0, n);

            //先清空
            Builder.Clear();

            //因爲要訪問ui資源,所以需要使用invoke方式同步ui
            this.Invoke((EventHandler)(delegate
            {
                //委託方法在txGet控件中顯示接收到的字符
                Builder.Append(Encoding.ASCII.GetString(buf));
                this.txGet.AppendText(Builder.ToString());

            }));

        }

“打開串口”按鈕的鼠標點擊相應方法:

    //打開按鈕的事件響應
        private void BtnOpen_Click(object sender, EventArgs e)
        {
            //如果串口已經是打開狀態,則此按鈕關閉串口
            if (this.serialPort.IsOpen)
            {
                this.serialPort.Close();
            }
             //串口關閉狀態,打開之
            else
            {
                //設置好端口名和波特率
                comm.PortName = this.comboPortName.Text;
                comm.BaudRate = int.Parse(this.comboPortBaudrate.Text);
                
                try
                {
                    comm.Open();
                }
                //打開失敗,拋出異常
                catch(Exception ex)
                    {
                        comm = new SerialPort();
                        MessageBox.Show(ex.Message);
                    }

            }

            //按鈕顯示文字轉變
            this.BtnOpen.Text = comm.IsOpen ? "關閉串口" : "打開串口";
            
            //發送按鈕功能使能
            this.BtnSend.Enabled = comm.IsOpen;
        }


點擊“發送”按鈕將數據送入IO的數據緩衝區中,代碼如下:

  //點擊發送按鈕事件的響應方法
        private void BtnSend_Click(object sender, EventArgs e)
        {
    
            //調用封裝的wirte方法,將txSend中的文本發送到IO的緩衝區,傳給單片機
            comm.Write(this.txSend.Text);

        }

 

如此這樣,加上UI界面上控件的添加,就可以實現一個簡單的串口通信程序了。
最後附上VS2010開發環境下的完整代碼下載地址,猛擊此處



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章