首頁 > 軟體

C#基於WinForm實現串列埠通訊

2022-02-17 16:00:56

串列埠通訊是一種計算機常用的資料傳輸方式。

程式執行如下:

首先,檢查計算機的串列埠,並獲取所有串列埠資訊。

private void CheckPort()//檢查串列埠是否可用
        {
            myLog(2, "檢測串列埠開始!");  //log記錄函數
            comboBox1.Items.Clear();//清除控制元件中的當前值         
            string[] a = SerialPort.GetPortNames();
            if (a.Length != 0)
            {
                for (int i = 0; i < a.Length; i++)
                {
                    comboBox1.Items.Add(a[i]);
                }
                comboBox1.SelectedIndex = 0;//??
                myLog(2, "檢測串列埠完成");
            }
            else
            {
                myLog(2, "無可用串列埠...", true);
            }
        }
        private void SetPort()//設定串列埠
        {
            try
            {
                serialPort1.PortName = comboBox1.Text.Trim();//串列埠名給了串列埠類
                //波特率   虛擬串列埠的波特率好像不能修改,但得將其賦為空,不然報錯         
                // serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text.ToString().Trim());        
                // 9600;
                serialPort1.BaudRate = Convert.ToInt32("".Trim());
                //奇偶效驗
                if (comboBox5.Text.Trim() == "奇校驗")
                {
                    serialPort1.Parity = Parity.Odd;//將奇校驗位給了sp的協定
                }
                else if (comboBox5.Text.Trim() == "偶校驗")
                {
                    serialPort1.Parity = Parity.Even;
                }
                else
                {
                    serialPort1.Parity = Parity.None;
                }
                //停止位
                if (comboBox4.Text.Trim() == "1.5")
                {
                    serialPort1.StopBits = StopBits.OnePointFive;//設定停止位有幾位
                }
                else if (comboBox4.Text.Trim() == "2")
                {
                    serialPort1.StopBits = StopBits.Two;
                }
                else
                {
                    serialPort1.StopBits = StopBits.One;
                }
                serialPort1.DataBits = Convert.ToInt16(comboBox3.Text.ToString().Trim());//資料位
                serialPort1.Encoding = Encoding.UTF8;//串列埠通訊的編碼格式
                serialPort1.Open();
            }
            catch { }
        }
        /// <summary>
        /// Log記錄
        /// </summary>
        /// <param name="aa">aa=  0為傳送  1為接受 2為日常記錄</param>
        /// <param name="mystr">記錄內容</param>
        /// <param name="IsHint">true 顯示彈框,false 不顯示彈框 預設false</param>
        private void myLog(int aa, string mystr, bool IsHint = false)
        {
            //log存放路徑
            string myypath = myPath + DateTime.Now.ToString("yyyyMMdd") + ".txt";
            StreamWriter sw = new StreamWriter(myypath, true);
            string tempSendstr;
            if (aa == 0)
            {
                tempSendstr = DateTime.Now.ToString("HH:mm:ss.fff") + "  " + serialPort1.PortName + " 傳送--->>>  " + mystr;
            }
            else if (aa == 1)
            {
                tempSendstr = DateTime.Now.ToString("HH:mm:ss.fff") + "  " + serialPort1.PortName + " 接收<<<---  " + mystr;
            }
            else
            {
                tempSendstr = DateTime.Now.ToString("HH:mm:ss.fff") + "  " + mystr;
            }
            sw.WriteLine(tempSendstr);
            sw.Close();
            //彈框提示
            if (IsHint)
            {
                MessageBox.Show(mystr, "提示");
            }
            if (listBox1.Items.Count >= 10) listBox1.Items.Clear();
            listBox1.Items.Add(tempSendstr);
        }

大部分的筆電都不帶串列埠的,我們可以在網上下載 Configure Virtual Serial Port Driver,給自己的筆電新增幾對虛擬串列埠(虛擬串列埠都是成對且一一匹配的),再用串列埠偵錯助手就可以進行偵錯了。

資料的傳送:

 //傳送
private void button3_Click(object sender, EventArgs e)
        {
            if(!serialPort1.IsOpen)
            {
                MessageBox.Show("串列埠未開啟,請檢查!");
                return;
            }
            string mystr1 = textBox1.Text;
            byte[] a = Encoding.UTF8.GetBytes(mystr1);
            string mystr2 = Encoding.UTF8.GetString(a);
            serialPort1.Write(mystr2);//將資料寫入串列埠輸出緩衝區
            myLog(0, mystr2);
        }

資料接收:

//串列埠接收資料
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            Thread.Sleep(100);
            this.Invoke((EventHandler)(delegate //非同步委託一個執行緒
            {
                if (serialPort1.BytesToRead > 0)
                {
                    byte[] a = new byte[serialPort1.BytesToRead];//讀出緩衝區串列埠通訊的位元組                                              
                    int readbytes = 0;
                    while (serialPort1.Read(a, readbytes, serialPort1.BytesToRead - readbytes) <= 0) ;
                    string str = UTF8Encoding.UTF8.GetString(a);
                    textBox2.Text = str + "rn";
                    myLog(1, str);
                }
            }));
        }

這是串列埠之間字串的傳送與接收,如要進行十六進位制的傳輸,只需要在資料傳送和接收時將字串轉化成十六進位制,再寫進緩衝區或讀取。

多條資訊傳送時,可能會出現下面的情況。

串列埠偵錯助手將三次傳送的資料一起讀出來了,此時我們只需要在傳送時給上一定的延時即可。

這樣就能實現串列埠多條資訊的傳送與接收了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com