WinFormC# Modbus RTU 通信学习过程-通信连接
学习想法:开始学习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)定义变量
-
#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测试)
第三步: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)
第四步:添加窗口上电默认程序
-
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)奇偶校验
-
/// <summary>
-
/// 获取窗体选中的奇偶校验
-
/// </summary>
-
/// <returns></returns>
-
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)停止位
-
/// <summary>
-
/// 获取窗体选中的停止位
-
/// </summary>
-
/// <returns></returns>
-
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 = "";
-
}
***效果展示
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhiabaef
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22