【WinForm】C# Modbus RTU 通信学习过程-通信连接

学习想法:开始学习Modbus RTU了,其实就是NModbus4的学习使用,目前先记录下通信连接的学习过程,后续学习到了再详细记录;

第一步:引入NModbus4类库

【WinForm】C# Modbus RTU 通信学习过程-通信连接_第1张图片
【WinForm】C# Modbus RTU 通信学习过程-通信连接_第2张图片
using Modbus.Device;

第二步:建立Form1界面,

GroupBox : GroupBox1-串口状态、GroupBox2-通讯信息;

Button : btConnect-启动连接、btMessageClear-清空;

ComboBox : cbxPort-串口号、cbxBaudRate-波特率、cbxDataBits-数据位、cbxParity-奇偶校验、

cbxStopBits-停止位;

TextBox : tbMessage-通讯信息;

串口号旁边的小红点是一个Button,用来做串口号搜索的指示,Lamp1-指示灯1

【WinForm】C# Modbus RTU 通信学习过程-通信连接_第3张图片

第二步:串口号搜索程序,利用定时器进行定时搜索,搜索到串口号后会添加到Combobox中

1)定义变量

        #region 定义全局变量
        //端口序号
        private int m_comBoxNums = 0;
        //串口实例
        private SerialPort serialPort = new SerialPort();
        //ModbusRTU主站字段
        private static IModbusMaster master;

        #endregion

2)添加timer1_Tick程序

private void timer1_Tick(object sender, EventArgs e)//定时刷新串口,获取端口号,指示灯闪烁
        {
            string Cur_PortName = cbxPort.Text;

            try
            {
                string[] strName = null;
                strName = SerialPort.GetPortNames();

                if (m_comBoxNums != strName.Length)
                {
                    m_comBoxNums = strName.Length;

                    cbxPort.Items.Clear();
                    cbxPort.Text = null;

                    for (int i = 0; i < m_comBoxNums; i++)//判断串口刷新后状态
                    {
                        if (strName[i] == Cur_PortName) { cbxPort.Text = Cur_PortName; }
                        cbxPort.Items.Add(strName[i]);
                    }
                    cbxPort.Text = strName[0];
                    serialPort.PortName = cbxPort.Text;
                }
            }

            catch (Exception ex)
            {
                if (ex.Source != null)
                {
                }
            }

            if(Lamp1.BackColor == Color.Red)
            {
                Lamp1.BackColor = Color.Green;
            }
            else
            {
                Lamp1.BackColor = Color.Red;
            }
        }

3)使用虚拟串口驱动添加端口(因为现在使用的笔记本没有自带的串口,所以就使用虚拟串口驱动进行测试,也方便后续使用Modbus Slave测试)

【WinForm】C# Modbus RTU 通信学习过程-通信连接_第4张图片

第三步:ComboBox :cbxBaudRate-波特率、cbxDataBits-数据位、cbxParity-奇偶校验、cbxStopBits-停止位,信息的添加;

点击ComboBox右上角的小箭头,选择“编辑项”,把相应的数据添加到“字符串集合编辑器”中

1)波特率(300、600、1200、2400、4800、9600、14400、19200、38400、57600、115200、128000、256000)

【WinForm】C# Modbus RTU 通信学习过程-通信连接_第5张图片

2)数据位(7、8)

【WinForm】C# Modbus RTU 通信学习过程-通信连接_第6张图片

3)奇偶校验(Odd、Even、None)

【WinForm】C# Modbus RTU 通信学习过程-通信连接_第7张图片

4)停止位(One、Two)

【WinForm】C# Modbus RTU 通信学习过程-通信连接_第8张图片

第四步:添加窗口上电默认程序

private void Form1_Load(object sender, EventArgs e)//窗口加载
        {
            //窗口开启定时器默认打开
            timer1.Enabled = true;
            //设置默认选中项
            cbxBaudRate.SelectedIndex = 5;
            cbxDataBits.SelectedIndex = 1;
            cbxParity.SelectedIndex = 1;
            cbxStopBits.SelectedIndex = 0;
            //通讯信息文本框清空
            tbMessage.Text = "";


        }

第五步:添加ComboBox选择数据方法,主要是奇偶校验和停止位,其他的直接获取后进行类型转换即可

1)奇偶校验

/// 
        /// 获取窗体选中的奇偶校验
        /// 
        /// 
        private Parity GetSelectedParity()
        {
            switch (cbxParity.SelectedItem.ToString())
            {
                case "Odd":
                    return Parity.Odd;
                case "Even":
                    return Parity.Even;
                case "None":
                    return Parity.None;
                default:
                    return Parity.None;
            }
        }

2)停止位

/// 
        /// 获取窗体选中的停止位
        /// 
        /// 
        private StopBits GetSelectedStopBits()
        {
            switch (cbxStopBits.SelectedItem.ToString())
            {
                case "One":
                    return StopBits.One;
                case "Two":
                    return StopBits.Two;
                default:
                    return StopBits.One;
            }
        }

第六步:添加ShowMesage的方法,这个方法让我们更便捷的显示需要显示到消息框信息

void ShowMesage(string Mes)//通讯显示函数
        {

            string ch = "\r\n";
            Mes += ch;
            tbMessage.AppendText(Mes);
        }

第七步:添加btConnect_Click启动连接程序,

 private void btConnect_Click(object sender, EventArgs e)//启动连接
        {
            if (serialPort.IsOpen)
            {
                timer1.Enabled = true;
                serialPort.Close();
                btConnect.Text = "启动连接";
                ShowMesage(serialPort.PortName.ToString() + ","
                                + serialPort.BaudRate.ToString() + ","
                                + serialPort.DataBits.ToString() + ","
                                + serialPort.Parity.ToString() + ","
                                + serialPort.StopBits.ToString() + ","
                                + "通信已断开");
            }

            else
            {
                try
                {
                    timer1.Enabled = false;
                    //创建Rtu主站
                    serialPort.PortName = cbxPort.SelectedItem.ToString();
                    serialPort.BaudRate = Convert.ToInt32(cbxBaudRate.SelectedItem);
                    serialPort.DataBits = Convert.ToInt32(cbxDataBits.SelectedItem);
                    serialPort.Parity = GetSelectedParity();
                    serialPort.StopBits = GetSelectedStopBits();
                    
                    //创建ModbusRTU主站实例
                    master = ModbusSerialMaster.CreateRtu(serialPort);

                    serialPort.Open();

                    Lamp1.BackColor = Color.Green;

                }
                catch
                {
                    btConnect.Text = "启动连接";
                    ShowMesage( serialPort.PortName.ToString()+ ","
                                + serialPort.BaudRate.ToString() + "," 
                                + serialPort.DataBits.ToString() + ","
                                + serialPort.Parity.ToString() + ","
                                + serialPort.StopBits.ToString() + ","
                                + "通信未建立");
                    return;
                }
                btConnect.Text = "断开连接";
                ShowMesage(serialPort.PortName.ToString() + ","
                             + serialPort.BaudRate.ToString() + ","
                             + serialPort.DataBits.ToString() + ","
                             + serialPort.Parity.ToString() + ","
                             + serialPort.StopBits.ToString() + ","
                             + "通信已建立");
            }
        }

第八步:添加Form1_FormClosing事件,在事件中添加窗口关闭时断开串口连接程序

 private void Form1_FormClosing(object sender, FormClosingEventArgs e)//窗口关闭
        {
            try
            {
                if (serialPort.PortName != null)
                {
                    serialPort.Close();
                }
            }
            catch (Exception ex)
            {
                if (ex.Source != null)
                {

                }
            }
        }

第九步:添加btMessageClear_Click事件,用于消息框清空

private void btMessageClear_Click(object sender, EventArgs e)//消息框清空
        {
            tbMessage.Text = "";
        }

***效果展示

【WinForm】C# Modbus RTU 通信学习过程-通信连接_第9张图片

你可能感兴趣的:(学习过程,c#,学习)