C#串列埠通訊程式SerialPort類

xmfthu發表於2012-08-23

上篇文章主要是關於串列埠通訊中微控制器部分的程式編寫。在實際應用中,常常還要有上位機的配合才能完成工作。寫串列埠通訊的上位機程式,常常應用的程式語言有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開發環境下的完整程式碼下載地址,猛擊此處



相關文章