zoukankan      html  css  js  c++  java
  • 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);

                    }

     

                }

            }

        }

    }

     

     

  • 相关阅读:
    SpringCloud系列二:Restful 基础架构(搭建项目环境、创建 Dept 微服务、客户端调用微服务)
    SpringCloud系列一:SpringCloud的简介和架构
    SpringBoot系列十二:SpringBoot整合 Shiro
    SpringBoot系列十一:SpringBoot整合Restful架构(使用 RestTemplate 模版实现 Rest 服务调用、Swagger 集成、动态修改日志级别)
    SpringBoot系列十:SpringBoot整合Redis
    SpringBoot系列九:SpringBoot服务整合(整合邮件服务、定时调度、Actuator监控)
    SpringBoot系列八:SpringBoot整合消息服务(SpringBoot 整合 ActiveMQ、SpringBoot 整合 RabbitMQ、SpringBoot 整合 Kafka)
    SpringBoot系列七:SpringBoot 整合 MyBatis(配置 druid 数据源、配置 MyBatis、事务控制、druid 监控)
    SpringBoot系列六:SpringBoot整合Tomcat
    SpringBoot系列五:SpringBoot错误处理(数据验证、处理错误页、全局异常)
  • 原文地址:https://www.cnblogs.com/bacazy/p/3500117.html
Copyright © 2011-2022 走看看