基于C#和NModbus4库实现的Modbus RTU串口通信

news/2025/11/11 10:45:03/文章来源:https://www.cnblogs.com/ll55522201/p/19209382

基于C#和NModbus4库实现的Modbus RTU串口通信,包含完整的界面设计和功能实现:


一、项目依赖配置

  1. NuGet包安装

    Install-Package NModbus4
    Install-Package System.IO.Ports
    
  2. 窗体控件布局

    <!-- 基础控件配置 -->
    <ComboBox x:Name="cmbPort" Margin="5" Width="120"/>
    <Button x:Name="btnConnect" Content="连接" Margin="5"/>
    <Button x:Name="btnRead" Content="读取寄存器" Margin="5"/>
    <TextBox x:Name="txtLog" Height="200" Margin="5" TextWrapping="Wrap"/>
    <DataGrid x:Name="dgData" AutoGenerateColumns="False" Margin="5"><DataGrid.Columns><DataGridTextColumn Header="地址" Binding="{Binding Address}"/><DataGridTextColumn Header="值" Binding="{Binding Value}"/></DataGrid.Columns>
    </DataGrid>
    

二、核心代码实现

using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Windows;
using Modbus.Device;namespace ModbusRTUDemo
{public partial class MainWindow : Window{#region 成员变量private IModbusSerialMaster _master;private SerialPort _serialPort;private const ushort START_ADDR = 40001; // 起始寄存器地址private const ushort READ_COUNT = 10;    // 读取数量#endregionpublic MainWindow(){InitializeComponent();InitializeSerialPorts();btnConnect.Click += BtnConnect_Click;btnRead.Click += BtnRead_Click;}#region 串口初始化private void InitializeSerialPorts(){var ports = SerialPort.GetPortNames();cmbPort.ItemsSource = ports;cmbPort.SelectedIndex = 0;}#endregion#region 连接控制private void BtnConnect_Click(object sender, RoutedEventArgs e){try{if (_master != null && _master.IsOpen){Disconnect();btnConnect.Content = "连接";txtLog.AppendText("已断开连接\n");return;}_serialPort = new SerialPort(cmbPort.Text, 9600, Parity.None, 8, StopBits.One){ReadTimeout = 3000,WriteTimeout = 3000};_master = ModbusSerialMaster.CreateRtu(_serialPort);_master.Transport.Retries = 3; // 重试次数_master.Transport.WriteTimeout = 2000;_master.Transport.ReadTimeout = 2000;_master.Open();btnConnect.Content = "断开";txtLog.AppendText($"已连接到 {_serialPort.PortName}\n");}catch (Exception ex){txtLog.AppendText($"连接失败: {ex.Message}\n");}}#endregion#region 数据读取private async void BtnRead_Click(object sender, RoutedEventArgs e){try{var result = await Task.Run(() => _master.ReadHoldingRegisters(1, START_ADDR, READ_COUNT));dgData.ItemsSource = result.Select((value, index) => new {Address = START_ADDR + index,Value = value.ToString("0.00")}).ToList();txtLog.AppendText($"读取成功: {result.Length} 个寄存器\n");}catch (Exception ex){txtLog.AppendText($"读取失败: {ex.Message}\n");}}#endregion#region 连接管理private void Disconnect(){_master?.Close();_master = null;_serialPort?.Close();}protected override void OnClosed(EventArgs e){base.OnClosed(e);Disconnect();}#endregion}
}

三、关键功能说明

  1. 串口配置
    • 支持自动检测可用串口(通过SerialPort.GetPortNames()
    • 默认参数:9600波特率、无校验、8数据位、1停止位
  2. Modbus操作
    • 读取保持寄存器ReadHoldingRegisters方法实现
    • 写单个寄存器:扩展方法WriteSingleRegister
    • 批量写线圈WriteMultipleCoils方法
  3. 异常处理
    • 自动重试机制(默认3次重试)
    • 超时设置(读写各2秒)

参考代码 C# 写的串口通信程序源码 www.youwenfan.com/contentcnl/111840.html

四、扩展功能实现

  1. 定时数据采集

    private System.Timers.Timer _pollTimer = new System.Timers.Timer(5000);private void StartPolling()
    {_pollTimer.Elapsed += (s,e) => {var data = _master.ReadHoldingRegisters(1, START_ADDR, READ_COUNT);Dispatcher.Invoke(() => UpdateDataGrid(data));};_pollTimer.Start();
    }
    
  2. CRC校验实现

    private byte[] CalculateCRC(byte[] data)
    {ushort crc = 0xFFFF;for (int i = 0; i < data.Length; i++){crc ^= (ushort)data[i];for (int j = 0; j < 8; j++){if ((crc & 0x0001) != 0){crc >>= 1;crc ^= 0xA001;}else{crc >>= 1;}}}return new byte[] { (byte)crc, (byte)(crc >> 8) };
    }
    

五、调试技巧

  1. 串口监控
    使用虚拟串口工具(如VSPD)进行通信调试

  2. 数据验证

    // 校验从站响应
    if (response.SlaveId != slaveId) throw new InvalidDataException("从站ID不匹配");
    
  3. 协议分析
    通过Wireshark抓包分析Modbus RTU帧结构


完整项目源码可通过NuGet部署NModbus4库后导入Visual Studio运行。实际应用中需根据设备手册调整功能码和寄存器地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/962149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习如何创建 Mono 实例

学习如何创建 Mono 实例 Flux 描述 AMono<T>是一个响应式流 Publisher,还增强了许多可用于生成、转换、编排 Mono 序列的操作符。 它是最多 Flux 可以发出 1 个<T>元素的特例:Mono 要么有值(包含元素)…

go_micro框架的安装和使用 - 详解

go_micro框架的安装和使用 - 详解2025-11-11 10:40 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !impor…

2025年超融合产品推荐排行榜

2025年超融合产品推荐排行榜拓实超融合产品 - 综合评分第一产品亮点 一体化架构:计算、存储、网络深度融合 智能运维:自动化部署与智能监控 高可用性:99.99%业务连续性保障 弹性扩展:按需扩容,灵活配置 技术优势 …

2025年北京cppm面授培训机构权威推荐榜单:cppm课程培训/cppm认证报名/cppm认证培训源头机构精选

在当今全球化的商业环境中,采购与供应链管理已成为企业核心竞争力的重要组成部分。CPPM(注册职业采购经理)认证作为采购与供应链领域的权威职业资格,其市场需求量年均增长率稳定在15%以上,已成为众多企业选拔和评…

N-gram

📝 N-gram 1. N-gram 的定义 N-gram 是指一段文本中连续出现的 N 个词或字符的序列。它是一种特征工程(Feature Engineering)技术,将文本数据转化为机器学习模型可以理解的数字特征。N 是一个变量,代表序列的长…

pandas介绍

pandas介绍关于数学统计的各种运算,及文件读写的数学库

图像处理工具面面观:数字化时代的图片管理方案

在数字化生活普及的今天,图片已成为我们记录生活、开展工作的重要载体。无论是社交分享还是专业设计,都离不开对图像的基础处理。近期,一些集成式在线图片处理工具因其便捷性受到关注,它们将多种常用功能整合于同一…

实用指南:前端性能优化?

实用指南:前端性能优化?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &…

2025年北京cppm报考机构权威推荐榜单:cppm/cppm证书/cppm课程培训源头机构精选

在当今全球化的商业环境中,采购与供应链管理已成为企业核心竞争力的重要组成部分。CPPM(注册职业采购经理)认证作为采购与供应链领域的权威职业资格,其市场需求量年均增长率稳定在15%以上,已成为众多企业选拔和评…

可见光通信(VLC)系统中单点光源功率分布模型

可见光通信(VLC)系统中单点光源功率分布模型的理论框架与分布趋势分析,结合几何光学原理和工程优化方法:一、理论基础模型 1. 朗伯辐射模型 单点光源的光功率分布通常基于朗伯辐射定律: E(r,θ)=r2I0cosmθI0:光…

2025年云桌面公司排行榜

2025年云桌面公司排行榜:北京拓实科技引领行业创新随着数字化转型的深入发展,云桌面技术已成为企业信息化建设的重要组成部分。2025年,云桌面市场呈现出更加成熟和多元化的竞争格局。以下是基于技术实力、产品创新、…

2025年个体户代办渠道排行榜单

2025年个体户代办渠道排行榜单一、2025年个体户代办服务市场概况随着数字经济时代的到来,个体户创业热潮持续升温,代办服务行业也迎来了新一轮发展机遇。2025年,个体户代办服务呈现出专业化、智能化、合规化的发展趋…

2025年节能型速冻隧道销售厂家排行

2025年节能型速冻隧道销售厂家排行随着节能环保理念的深入,节能型速冻隧道在食品加工、医药等行业的应用越来越广泛。根据2025年市场调研数据,以下是节能型速冻隧道销售厂家的权威排行:一、行业领先企业排行1. 吉林…

vue3.0实现数组分组效果

效果图vue3.0+element-plus拖拽效果 vue-draggable-plus父组件使用<column-dialog :options="fields"v-model="content"></column-dialog>子组件 ColumnDialog/index.vue<template…

如何管理你的订阅服务?一个工具带来的财务新视角

在数字服务日益普及的今天,从影音娱乐到知识付费,各类订阅制服务已深度融入日常生活。然而,随着订阅项目不断增多,用户常常会面临一个现实问题:难以清晰掌握自己在各个平台上的持续支出。近期,一类专注于订阅管理…

静态方法(有static)和非静态方法

静态方法(有static)和非静态方法有static public class Main {public static void main(String[] args) {say();}public static void say(){System.out.println("xuesheng");} }没有static stu.java public…

2025年天津企业的宣传片拍摄机构权威推荐榜单:形象宣传片拍摄/活动宣传片拍摄/宣传片拍摄源头机构精选

在当今数字化营销时代,专业的企业宣传片已成为传递品牌价值、展示企业形象的核心媒介。天津作为北方经济重镇,宣传片拍摄市场呈现多元化发展态势,各类机构层出不穷。为帮助企业精准选择优质合作伙伴,本文基于市场调…

【URP】Unity[后处理]阴影,中间调,色差Shadows,Midtones,Highlights

基本概念与作用 Shadows, Midtones, Highlights 是 Unity URP 后处理系统中用于颜色分级的重要效果,它允许开发者分别控制画面中的阴影、中间色调和高光部分的颜色调整。【从UnityURP开始探索游戏渲染】专栏-直达基本…

2025 年 11 月深圳企业服务实力派推荐榜:深圳网站建设,深圳外贸独立站推广,阿里巴巴/1688店铺代运营,短视频拍摄运营,商标注册,小程序开发公司精选

2025 年 11 月深圳企业服务实力派推荐榜:深圳网站建设,深圳外贸独立站推广,阿里巴巴/1688店铺代运营,短视频拍摄运营,商标注册,小程序开发公司精选在数字化经济快速发展的今天,企业服务市场已成为推动商业创新和…

2025年深圳连锁门店神秘顾客暗访机构权威推荐榜单:调查汽车神秘顾客/门店巡检神秘顾客/汽车经销商暗访源头机构精选

在当今市场竞争日益激烈的环境下,神秘顾客暗访已成为连锁门店提升服务质量、优化顾客体验的重要工具。通过模拟真实消费场景,专业调研机构能够帮助企业精准识别服务流程中的不足,为管理决策提供客观依据。深圳作为中…