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);

                }

 

            }

        }

    }

}

 

 

posted @ 2013-12-31 21:54  bacazy  Views(5123)  Comments(0Edit  收藏  举报