• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

WinFormC# Modbus RTU 通信学习过程-通信连接

武飞扬头像
你好阿劲
帮助1

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

第一步:引入NModbus4类库

学新通
学新通
using Modbus.Device;

第二步:建立Form1界面,

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

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

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

cbxStopBits-停止位;

TextBox : tbMessage-通讯信息;

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

学新通

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

1)定义变量

  1.  
    #region 定义全局变量
  2.  
    //端口序号
  3.  
    private int m_comBoxNums = 0;
  4.  
    //串口实例
  5.  
    private SerialPort serialPort = new SerialPort();
  6.  
    //ModbusRTU主站字段
  7.  
    private static IModbusMaster master;
  8.  
     
  9.  
    #endregion

2)添加timer1_Tick程序

  1.  
    private void timer1_Tick(object sender, EventArgs e)//定时刷新串口,获取端口号,指示灯闪烁
  2.  
    {
  3.  
    string Cur_PortName = cbxPort.Text;
  4.  
     
  5.  
    try
  6.  
    {
  7.  
    string[] strName = null;
  8.  
    strName = SerialPort.GetPortNames();
  9.  
     
  10.  
    if (m_comBoxNums != strName.Length)
  11.  
    {
  12.  
    m_comBoxNums = strName.Length;
  13.  
     
  14.  
    cbxPort.Items.Clear();
  15.  
    cbxPort.Text = null;
  16.  
     
  17.  
    for (int i = 0; i < m_comBoxNums; i )//判断串口刷新后状态
  18.  
    {
  19.  
    if (strName[i] == Cur_PortName) { cbxPort.Text = Cur_PortName; }
  20.  
    cbxPort.Items.Add(strName[i]);
  21.  
    }
  22.  
    cbxPort.Text = strName[0];
  23.  
    serialPort.PortName = cbxPort.Text;
  24.  
    }
  25.  
    }
  26.  
     
  27.  
    catch (Exception ex)
  28.  
    {
  29.  
    if (ex.Source != null)
  30.  
    {
  31.  
    }
  32.  
    }
  33.  
     
  34.  
    if(Lamp1.BackColor == Color.Red)
  35.  
    {
  36.  
    Lamp1.BackColor = Color.Green;
  37.  
    }
  38.  
    else
  39.  
    {
  40.  
    Lamp1.BackColor = Color.Red;
  41.  
    }
  42.  
    }
学新通

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

学新通

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

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

学新通
学新通

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

学新通

2)数据位(7、8)

学新通

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

学新通

4)停止位(One、Two)

学新通

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

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

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

1)奇偶校验

  1.  
    /// <summary>
  2.  
    /// 获取窗体选中的奇偶校验
  3.  
    /// </summary>
  4.  
    /// <returns></returns>
  5.  
    private Parity GetSelectedParity()
  6.  
    {
  7.  
    switch (cbxParity.SelectedItem.ToString())
  8.  
    {
  9.  
    case "Odd":
  10.  
    return Parity.Odd;
  11.  
    case "Even":
  12.  
    return Parity.Even;
  13.  
    case "None":
  14.  
    return Parity.None;
  15.  
    default:
  16.  
    return Parity.None;
  17.  
    }
  18.  
    }
学新通

2)停止位

  1.  
    /// <summary>
  2.  
    /// 获取窗体选中的停止位
  3.  
    /// </summary>
  4.  
    /// <returns></returns>
  5.  
    private StopBits GetSelectedStopBits()
  6.  
    {
  7.  
    switch (cbxStopBits.SelectedItem.ToString())
  8.  
    {
  9.  
    case "One":
  10.  
    return StopBits.One;
  11.  
    case "Two":
  12.  
    return StopBits.Two;
  13.  
    default:
  14.  
    return StopBits.One;
  15.  
    }
  16.  
    }
学新通

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

  1.  
    void ShowMesage(string Mes)//通讯显示函数
  2.  
    {
  3.  
     
  4.  
    string ch = "\r\n";
  5.  
    Mes = ch;
  6.  
    tbMessage.AppendText(Mes);
  7.  
    }

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

  1.  
    private void btConnect_Click(object sender, EventArgs e)//启动连接
  2.  
    {
  3.  
    if (serialPort.IsOpen)
  4.  
    {
  5.  
    timer1.Enabled = true;
  6.  
    serialPort.Close();
  7.  
    btConnect.Text = "启动连接";
  8.  
    ShowMesage(serialPort.PortName.ToString() ","
  9.  
    serialPort.BaudRate.ToString() ","
  10.  
    serialPort.DataBits.ToString() ","
  11.  
    serialPort.Parity.ToString() ","
  12.  
    serialPort.StopBits.ToString() ","
  13.  
    "通信已断开");
  14.  
    }
  15.  
     
  16.  
    else
  17.  
    {
  18.  
    try
  19.  
    {
  20.  
    timer1.Enabled = false;
  21.  
    //创建Rtu主站
  22.  
    serialPort.PortName = cbxPort.SelectedItem.ToString();
  23.  
    serialPort.BaudRate = Convert.ToInt32(cbxBaudRate.SelectedItem);
  24.  
    serialPort.DataBits = Convert.ToInt32(cbxDataBits.SelectedItem);
  25.  
    serialPort.Parity = GetSelectedParity();
  26.  
    serialPort.StopBits = GetSelectedStopBits();
  27.  
     
  28.  
    //创建ModbusRTU主站实例
  29.  
    master = ModbusSerialMaster.CreateRtu(serialPort);
  30.  
     
  31.  
    serialPort.Open();
  32.  
     
  33.  
    Lamp1.BackColor = Color.Green;
  34.  
     
  35.  
    }
  36.  
    catch
  37.  
    {
  38.  
    btConnect.Text = "启动连接";
  39.  
    ShowMesage( serialPort.PortName.ToString() ","
  40.  
    serialPort.BaudRate.ToString() ","
  41.  
    serialPort.DataBits.ToString() ","
  42.  
    serialPort.Parity.ToString() ","
  43.  
    serialPort.StopBits.ToString() ","
  44.  
    "通信未建立");
  45.  
    return;
  46.  
    }
  47.  
    btConnect.Text = "断开连接";
  48.  
    ShowMesage(serialPort.PortName.ToString() ","
  49.  
    serialPort.BaudRate.ToString() ","
  50.  
    serialPort.DataBits.ToString() ","
  51.  
    serialPort.Parity.ToString() ","
  52.  
    serialPort.StopBits.ToString() ","
  53.  
    "通信已建立");
  54.  
    }
  55.  
    }
学新通

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

  1.  
    private void Form1_FormClosing(object sender, FormClosingEventArgs e)//窗口关闭
  2.  
    {
  3.  
    try
  4.  
    {
  5.  
    if (serialPort.PortName != null)
  6.  
    {
  7.  
    serialPort.Close();
  8.  
    }
  9.  
    }
  10.  
    catch (Exception ex)
  11.  
    {
  12.  
    if (ex.Source != null)
  13.  
    {
  14.  
     
  15.  
    }
  16.  
    }
  17.  
    }
学新通

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

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

***效果展示

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhiabaef
系列文章
更多 icon
同类精品
更多 icon
继续加载