Windows串口通信(windows form)


 

參考:SerialPort

窗體設計:

 

數據詞典:

串口設置:

                   串口:cbx_PortName

                   波特率:cbx_BaudRate

                   奇偶校驗:cbx_Parity

                   停止位:cbx_StopBits

                   數據位:cbx_DataBits

         功能操作:

                   串口檢測:btn_PortTest

                   發送數據:btn_SendData

                   接收數據:btn_ReceiveData

                   關閉串口:btn_Close

         發送數據:tbx_SendData

         接收數據:tbx_ReceivedData

 

添加屬性:

         SerialPort sp = null;//新建一個串口對象,作為全局對象

        bool isOpen = false;//記錄串口的狀態

        bool isSetProperty = false;//記錄參數的設置狀態

 

方法

   

private

btn_port_test_Click(object sender, EventArgs e)

檢測可用串口,將可用串口添加至列表cbx_PortName

private

CheckPortSetting()

檢測串口的相關參數是否已設置,即判斷波特率,串口,終止位,數據位,奇偶校驗是否存在

private

CheckSendData()

檢測tbx_SendData中的內容是否為空

private

SetPortProperty()

判斷端口的屬性是否已設置,即從窗口中取值,並已傳遞給sp

private

btn_send_data_Click(object sender, EventArgs e)

發送數據命令,初始條件:tbx_SendData非空,參數已設置,串口已打開

private

btn_close_Click(object sender, EventArgs e)

串口關閉命令

protected

OnClosed(EventArgs e)

重載窗口關閉事件,確保串口已關閉

private

btn_receive_datat_Click(object sender, EventArgs e)

接收數據命令,初始條件:串口已打開

private

btn_LinkPort_Click(object sender, EventArgs e)

連接與斷開串口

 

Form1.cs:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO.Ports;

 

namespace WF_Port

{

    public partial class Form1 : Form

    {

        SerialPort sp = null;

        bool isOpen = false;

        bool isSetProperty = false;

 

        public Form1()

        {

            InitializeComponent();

            this.FormBorderStyle = FormBorderStyle.Fixed3D;//固定窗口大小

            this.MinimizeBox = false;//去掉最小化窗口

            this.MaximizeBox = false;//去掉最大化窗口

 

            //添加串口選項

            for (int i = 0; i < 8; i++)

            {

                cbx_PortName.Items.Add("COM" + (i + 1).ToString());

            }

            cbx_PortName.SelectedIndex = 2;//默認為COM3

 

            //添加波特率選擇項

            cbx_BaudRate.Items.Add("300");

            cbx_BaudRate.Items.Add("600");

            cbx_BaudRate.Items.Add("1200");

            cbx_BaudRate.Items.Add("2400");

            cbx_BaudRate.Items.Add("4800");

            cbx_BaudRate.Items.Add("9600");

            cbx_BaudRate.Items.Add("19200");

            cbx_BaudRate.Items.Add("38400");

            cbx_BaudRate.Items.Add("43000");

            cbx_BaudRate.Items.Add("56000");

            cbx_BaudRate.Items.Add("115200");

            cbx_BaudRate.SelectedIndex = 5;//默認9600

 

            //奇偶校驗位選擇項

            cbx_Parity.Items.Add("None");

            cbx_Parity.Items.Add("Odd");

            cbx_Parity.Items.Add("Even");

            cbx_Parity.SelectedIndex = 0;//默認不使用奇偶校驗

            //停止位選擇項

 

            cbx_StopBits.Items.Add("0");

            cbx_StopBits.Items.Add("1");

            cbx_StopBits.Items.Add("1.5");

            cbx_StopBits.Items.Add("2");

            cbx_StopBits.SelectedIndex = 1;//默認為1

 

            ///數據位選擇項

            cbx_DataBits.Items.Add("8");

            cbx_DataBits.Items.Add("7");

            cbx_DataBits.Items.Add("6");

            cbx_DataBits.Items.Add("5");

            cbx_DataBits.SelectedIndex = 0;//默認為8位

 

            btn_LinkPort.Text = "打開串口";

        }

 

        //端口檢測

        private void btn_port_test_Click(object sender, EventArgs e)

        {

            cbx_PortName.Items.Clear();

            for (int i = 0; i < 8; i++)

            {

                try

                {

                    SerialPort sp = new SerialPort("COM" + (i + 1).ToString());

                    sp.Open();

                    if (sp.IsOpen) tbx_status.Text = "COM" + (i + 1).ToString() + "已打開";

                    sp.Close();

                    cbx_PortName.Items.Add("COM" + (i + 1).ToString());

                }

                catch (Exception)

                {

                    //tbx_status.Text = "COM" + (i + 1).ToString() + "不可用";

                    continue;

                }

            }

        }

        //設置檢測

        private bool CheckPortSetting()

        {

            if (cbx_PortName.Text.Trim() == "") return false;

            if (cbx_StopBits.Text.Trim() == "") return false;

            if (cbx_DataBits.Text.Trim() == "") return false;

            if (cbx_Parity.Text.Trim() == "") return false;

            if (cbx_BaudRate.Text.Trim() == "") return false;

            return true;

        }

        //發送狀態檢測

        //檢測發送數據是否為空

        private bool CheckSendData()

        {

            if (tbx_SendData.Text.Trim() == "") return false;

            return true;

        }

        //------------------------------------------------------------------------

        //設置屬性

        private void SetPortProperty()

        {

            sp = new SerialPort();

            sp.PortName = cbx_PortName.Text.Trim();

            sp.BaudRate = Convert.ToInt32(cbx_BaudRate.Text.Trim());

            float f = Convert.ToSingle(cbx_StopBits.Text.Trim());

            if (f == 0)

            {

                sp.StopBits = StopBits.None;

            }

            else if (f == 1.5)

            {

                sp.StopBits = StopBits.OnePointFive;

            }

            else if (f == 1)

            {

                sp.StopBits = StopBits.One;

            }

            else if (f == 2)

            {

                sp.StopBits = StopBits.Two;

            }

            else

            {

                sp.StopBits = StopBits.One;

            }

            sp.DataBits = Convert.ToInt16(cbx_DataBits.Text.Trim());

            string s = cbx_Parity.Text.Trim();

            if (s.CompareTo("None") == 0)

            {

                sp.Parity = Parity.None;

            }

            else if (s.CompareTo("Odd") == 0)

            {

                sp.Parity = Parity.Odd;

            }

            else if (s.CompareTo("Even") == 0)

            {

                sp.Parity = Parity.Even;

            }

            else

            {

                sp.Parity = Parity.None;

            }

            sp.ReadTimeout = -1;           

        }

 

        private void btn_send_data_Click(object sender, EventArgs e)

        {

            if (!CheckPortSetting())

            {

                MessageBox.Show("串口未設置!", "錯誤提示");

                return;

            }

            if (!CheckSendData())

            {

                MessageBox.Show("請輸入要發送的數據!", "錯誤提示");

                return;

            }

            if (!isSetProperty)

            {

                SetPortProperty();

                isSetProperty = true;

            }

            if (isOpen)

            {

                try

                {

                    sp.WriteLine(tbx_SendData.Text);

                }

                catch (Exception)

                {

                    tbx_status.Text = "發送數據時發生錯誤!";

                    return;

                }

            }

            else

            {

                MessageBox.Show("串口未打開!", "錯誤提示");

                return;

            }

            tbx_SendData.Text = "";

        }

        //--------------------------------------------------------------------

        //關閉串口

        private void btn_close_Click(object sender, EventArgs e)

        {

            try

            {

                sp.Close();

                isOpen = false;

            }

            catch

            {

                ;

            }

        }

 

        //重載窗口關閉事件

        protected override void OnClosed(EventArgs e)

        {

            try

            {

                sp.Close();

                isOpen = false;

            }

            catch

            {

                ;

            }

            base.OnClosed(e);

        }

 

        private void btn_receive_datat_Click(object sender, EventArgs e)

        {

            if (isOpen)

            {

                try

                {

                    tbx_ReceivedData.Text += sp.ReadLine();

                }

                catch (Exception)

                {

                    tbx_status.Text = "讀取串口時發生錯誤!";

                    return;

                }

            }

            else

            {

                MessageBox.Show("串口未打開!", "錯誤提示");

                return;

            }

        }

 

        private void btn_LinkPort_Click(object sender, EventArgs e)

        {

            if (isOpen)

            {

                btn_LinkPort.Text = "打開串口";

                sp.Close();

                isOpen = false;

            }

            else

            {

                btn_LinkPort.Text = "關閉串口";

                try

                {

                    SetPortProperty();

                    sp.Open();

                    isOpen = true;

                }

                catch

                {

                    MessageBox.Show("串口未打開!", "錯誤提示", MessageBoxButtons.OK);

                }

 

            }

        }

    }

}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM