当前位置: 首页 > news >正文

Modbus-RTU协议C#实现

1、安装依赖包
System.IO.Ports
2、读协议

/// <summary>/// Modbus-RTU协议读实例/// </summary>private static void Read(){//组装一个请求报文// 01 03 00 00 00 0A C5 CDbyte slave = 0x01;//byte function = 0x03;   //读单个寄存器byte function = 0x01;   //读单个线圈状态int startAddress = 0;int length = 10;List<byte> bytes = new List<byte>();bytes.Add(slave);bytes.Add(function);bytes.Add(BitConverter.GetBytes(startAddress)[1]);bytes.Add(BitConverter.GetBytes(startAddress)[0]);bytes.Add(BitConverter.GetBytes(length)[1]);bytes.Add(BitConverter.GetBytes(length)[0]);//CRC校验bytes = CRC16(bytes);//组装好了进行串口通信SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);serialPort.Open();//向从站发送请求serialPort.Write(bytes.ToArray(), 0, bytes.Count);Task.Run(async () =>{await Task.Delay(100);byte[] buffer = new byte[serialPort.BytesToRead];serialPort.DiscardInBuffer();List<byte> bufferList = new List<byte>(buffer);bufferList.RemoveAt(0);bufferList.RemoveAt(0);bufferList.RemoveAt(0);bufferList.RemoveAt(bufferList.Count - 1);bufferList.RemoveAt(bufferList.Count - 1);//读寄存器//for(int i = 0; i < bufferList.Count; i++)//{//    List<byte> valueList = new List<byte>();//    valueList.Add(bufferList[i]);//    valueList.Add(bufferList[++i]);//    valueList.Reverse();//    ushort value=BitConverter.ToUInt16(valueList.ToArray(), 0);//    Console.WriteLine(value);//}//读线圈 09 00bufferList.Reverse();var values = string.Join("", bufferList.Select(x => Convert.ToString(x, 2).PadLeft(8, '0')).ToList()).ToList();values.Reverse();for (int i = 0; i < values.Count; i++){Console.WriteLine(Convert.ToBoolean(int.Parse(values[i].ToString())));}});}

3、写协议

/// <summary>/// Modbus-RTU协议写实例/// </summary>private static void Write(){//组装报文byte slave = 0x01;//byte function = 0x05;   //写单个线圈状态byte function = 0x06;   //写单个寄存器int startAddress = 0;bool value = false;int iv = 123;List<byte> bytes = new List<byte>();bytes.Add(slave);bytes.Add(function);bytes.Add(BitConverter.GetBytes(startAddress)[1]);bytes.Add(BitConverter.GetBytes(startAddress)[0]);//单线圈的写入//bytes.Add(value ? (byte)0xFF : (byte)0x00);//bytes.Add(0x00);//单寄存器写入bytes.Add(BitConverter.GetBytes(iv)[1]);bytes.Add(BitConverter.GetBytes(iv)[0]);//CRC校验bytes = CRC16(bytes);SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);serialPort.Open();//向从站发送请求serialPort.Write(bytes.ToArray(), 0, bytes.Count);//接收后如果报文一致,说明发送请求成功}

4、CRC16校验

/// <summary>/// CRC-16校验/// </summary>/// <param name="value"></param>/// <param name="poly"></param>/// <param name="crcInit"></param>/// <returns></returns>/// <exception cref="ArgumentException"></exception>private static List<byte> CRC16(List<byte> value,ushort poly=0xA001,ushort crcInit=0xFFFF){if (value == null || !value.Any())throw new ArgumentException("");//运算ushort crc = crcInit;for(int i=0; i<value.Count; i++){crc = (ushort)(crc ^ value[i]);for(int j=0; j<8; j++){crc=(crc&1)!=0?(ushort)((crc>>1)^poly):(ushort)(crc>>1);}}byte hi = (byte)((crc & 0xFF00) >> 8);byte lo=(byte)(crc & 0xFF);List<byte> buffer = new List<byte>();buffer.AddRange(value);buffer.Add(lo);buffer.Add(hi);return buffer;}

相关文章:

Modbus-RTU协议C#实现

1、安装依赖包 System.IO.Ports 2、读协议 /// <summary>/// Modbus-RTU协议读实例/// </summary>private static void Read(){//组装一个请求报文// 01 03 00 00 00 0A C5 CDbyte slave 0x01;//byte function 0x03; //读单个寄存器byte function 0x01; //…...

Redis学习---大数据技术之Redis(NoSQL简介、Redis简介、Redis安装、五大数据类型、相关配置、持久化)

星光下的赶路人star的个人主页 毅力是永久的享受 文章目录 1、NoSQL1.1 NoSQL数据库1.1.1 NoSQL是什么1.1.2 NoSQL的特点1.1.3 NoSQL的适用场景1.1.4 NoSQL的不适场景 1.2 NoSQL家族 2、Redis简介2.1 Redis官网2.2 Redis是什么2.3 Redis的应用场景2.3.1 配合关系型数据库做高速…...

基于组合双向拍卖的共享储能机制研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 2.1 算例数据 2.2 买家中标 2.3 卖家中标 &#x1f389;3 文献来源 &#x1f308;4 Matlab代码实现 &#x1f4a5;1 概述 文献来源&#xff1a; 摘要&#xff1a;为满足共享储能中储能用户的互补性和替代性需求、解决常规单…...

服务机器人有哪些品类

服务机器人是指具备自主运动、感知环境、实现人机交互等能力的机器人&#xff0c;它可以被应用于不同的场景&#xff0c;如餐饮、医疗、物流等行业。根据其功能和应用场景的不同&#xff0c;服务机器人可以分为以下几类&#xff1a;1. 餐饮服务机器人 随着社会发展和人们需…...

3.netty和protobuf

1.ChannelGroup可以免遍历由netty提供,覆盖remove方法即可触发删除channel\ 2.群聊私聊 13.群聊私聊简单原理图 3.netty心跳检测机制,客户端对服务器有没有读写(读,写空闲) //IdleStateHandler(3,5,7,TimeUnite.SECONDS)是netty提供的检测状态的处理器,也加到pipeline,读,写,…...

NLP实践——Llama-2 多轮对话prompt构建

NLP实践——Llama-2 多轮对话prompt构建 1. 问题提出2. prompt的正确形式3. 效果测试4. 结尾 1. 问题提出 最近&#xff0c;META开源了Llama-2模型&#xff0c;受到了广泛的关注和好评&#xff0c;然而&#xff0c;在官方给的使用说明中&#xff0c;并没有对使用方法进行特别细…...

《TCP IP网络编程》第十四章

第 14 章 多播与广播 14.1 多播 多播&#xff08;Multicast&#xff09;方式的数据传输是基于 UDP 完成的。因此 &#xff0c;与 UDP 服务器端/客户端的实现方式非常接近。区别在于&#xff0c;UDP 数据传输以单一目标进行&#xff0c;而多播数据同时传递到加入&#xff08;注…...

网络基础-认识每层的设备和每层的特点用途

目录 网络层次常见设备各层介绍数据链路层网络层传输层应用层 网络层次 常见设备 各层介绍 数据链路层 有了MAC地址。数据链路层工作在局域网中的&#xff0c;以帧为单位进行传输和处理数据。 网络层 网络层有了IP。不同的网络通过路由器连接成为互联网 路由器的功能:   …...

【Linux操作系统】深入解析Linux定时任务调度机制-cronat指令

在Linux操作系统中&#xff0c;定时任务调度是一项重要的功能&#xff0c;它可以让用户在指定的时间或周期性地执行特定的任务。这种机制使得用户能够自动化地执行一些重复性工作&#xff0c;提高工作效率。本文将详细介绍Linux定时任务调度的原理、常用指令和代码示例&#xf…...

动手学深度学习(一)预备知识

目录 一、数据操作 1. N维数组样例 2. 访问元素 3. 基础函数 &#xff08;1&#xff09; 创建一个行向量 &#xff08;2&#xff09;通过张量的shape属性来访问张量的形状和元素总数 &#xff08;3&#xff09;reshape()函数 &#xff08;4&#xff09;创建全0、全1、…...

item_get-KS-获取商品详情

一、接口参数说明&#xff1a; item_get-根据ID取商品详情 &#xff0c;点击更多API调试&#xff0c;请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/ks/item_get 名称类型必须描述keyString是调用key&#xff08;http://o0b.cn/…...

[华为OD] 最小传输时延(dijkstra算法)

明天就要面试了我也太紧张了吧 但是终于找到了一个比较好理解的dijkstra的python解法&#xff0c;让我快点把它背下来&#xff01;&#xff01;&#xff01;&#xff01; 文章目录 题目dijkstra算法的python实现python解答dfs解法dijkstra解法 题目 先把题目放出来 某通信网络…...

问道管理:总资产大于总市值好吗?

在财政领域&#xff0c;总财物和总市值是两个非常重要的指标。总财物是指公司所有的财物&#xff0c;包括固定财物、流动财物、无形财物等&#xff0c;而总市值则是指公司股票在商场上的总价值。当总财物大于总市值时&#xff0c;这是否是一个好的信号呢&#xff1f;咱们将从多…...

IBM Spectrum LSF (“LSF“ ,简称为负载共享设施) 用户案例

IBM Spectrum LSF (“LSF” &#xff0c;简称为负载共享设施) 用户案例 IBM Spectrum LSF (“LSF” &#xff0c;简称为负载共享设施) 软件是业界领先的企业级软件。 LSF 在现有异构 IT 资源之间分配工作&#xff0c;以创建共享&#xff0c;可扩展且容错的基础架构&#xff0c…...

Pytorch深度学习-----神经网络之非线性激活的使用(ReLu、Sigmoid)

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…...

Gis入门,使用起止点和两个控制点生成三阶贝塞尔曲线(共四个控制点,线段转曲线)

前言 本章讲解如何在gis地图中使用起止点和两个控制点(总共四个控制点)生成三阶贝塞尔曲线。 二阶贝塞尔曲线请参考上一章《Gis入门,如何根据起止点和一个控制点计算二阶贝塞尔曲线(共三个控制点)》 贝塞尔曲线(Bezier curve)介绍 贝塞尔曲线(Bezier curve)是一种…...

Web-7-深入理解Cookie与Session:实现用户跟踪和数据存储

深入理解Cookie与Session&#xff1a;实现用户跟踪和数据存储 今日目标 1.掌握客户端会话跟踪技术Cookie 2.掌握服务端会话跟踪技术Sesssion 1.会话跟踪技术介绍 会话&#xff1a;用户打开浏览器&#xff0c;访问web服务器的资源&#xff0c;会话建立&#xff0c;直到有一方断…...

Springboot设置Https

1、修改配置文件application.yml&#xff0c;并将*.jks放到resource目录下。 server:port: 8080ssl:key-store: classpath:*.jkskey-store-password: *key-store-type: JKSenabled: truekey-alias: boe.com.cn2、添加http转https的配置 Configuration public class TomcatCon…...

Windows 使用 Linux 子系统,轻轻松松安装多个linux

Windows Subsystem for Linux WSL 简称WSL,是一个在Windows 10\11上能够运行原生Linux二进制可执行文件&#xff08;ELF格式&#xff09;的兼容层。它是由微软与Canonical公司合作开发&#xff0c;其目标是使纯正的Ubuntu、Debian等映像能下载和解压到用户的本地计算机&#…...

中级课程——弱口令(认证崩溃)

文章目录 什么是弱口令密码生成器分类暴力破解万能密码测试环境工具 什么是弱口令 密码生成器 分类 暴力破解 万能密码 or true --测试环境 工具 九头蛇&#xff0c;超级弱口令爆破工具&#xff0c;bp&#xff0c;...

8人SolidWorks研发共享一台服务器——性能算力共享智能按需分配

8人SolidWorks研发团队可借助云飞云智能共享云桌面&#xff0c;通过以下方式实现一台服务器的性能算力共享与智能按需分配。一、核心硬件配置CPU&#xff1a;选择多核高主频处理器&#xff0c;如Intel Core i9 14900K&#xff08;24核32线程&#xff09;或AMD锐龙9 9950X&#…...

手机号查QQ号:解密腾讯通信协议的Python实战工具

手机号查QQ号&#xff1a;解密腾讯通信协议的Python实战工具 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾经遇到过这样的情况&#xff1a;手头有一个手机号&#xff0c;想知道它是否关联了QQ账号&#xff1f;或者作为开发…...

AI辅助开发:让快马平台Kimi模型帮你构建《构石》官网智能搜索功能

最近在帮《构石》期刊官网开发智能搜索功能时&#xff0c;发现用传统方式写代码效率太低。尝试了InsCode(快马)平台的AI辅助开发后&#xff0c;整个过程变得特别顺畅。这里分享下具体实现思路和平台使用体验。 需求分析 期刊官网需要支持多条件组合搜索&#xff0c;包括年份范围…...

DanKoe 视频笔记:人生经验课:给18岁自己的信

在本节课中&#xff0c;我们将学习一位28岁人士回顾过去&#xff0c;总结出的核心人生经验。这些经验旨在帮助年轻人&#xff0c;特别是那些感到迷茫、渴望超越平凡生活的人&#xff0c;建立自主性、明确目标并采取有效行动。我们将把这些经验整理成一套清晰的教程&#xff0c;…...

广东省高级会计师评审辅导知名品牌

在职业发展的道路上&#xff0c;专业资格认证是许多财务从业者提升自我、拓宽职业路径的重要一环。广东省高级会计师评审&#xff0c;作为一项专业性强、要求严格的职业能力认定&#xff0c;其准备过程需要系统性的指导与支持。中山力朗教育咨询有限公司&#xff0c;作为一家立…...

73:L的程序安全:蓝队的规范防御

作者&#xff1a; HOS(安全风信子) 日期&#xff1a; 2026-03-26 主要来源平台&#xff1a; GitHub 摘要&#xff1a; 程序安全是防御的基石&#xff0c;通过规范的流程、自动化执行和可追溯设计构建可靠的安全防御体系。本文分享程序安全的核心价值、L的程序安全策略、技术实现…...

深入解析C++中获取进程模块基址的高效实现方法

1. 为什么需要获取进程模块基址 在Windows系统编程中&#xff0c;获取进程模块基址是一个基础但极其重要的操作。简单来说&#xff0c;模块基址就是某个DLL或EXE文件被加载到内存中的起始地址。这个地址就像是模块在内存中的"门牌号"&#xff0c;有了它我们才能找到模…...

Local AI MusicGen商业应用:电商视频智能配乐

Local AI MusicGen商业应用&#xff1a;电商视频智能配乐 你是不是也遇到过这样的烦恼&#xff1f;制作电商短视频时&#xff0c;翻遍了免费音乐库&#xff0c;要么版权有问题&#xff0c;要么风格不搭&#xff0c;要么就是千篇一律的背景音。自己配乐&#xff1f;没那个时间和…...

OpenCVSharp摄像头开发避坑指南:C#实现高清录像+实时滤镜(WinForm版)

OpenCVSharp工业级摄像头开发实战&#xff1a;高清录像与实时滤镜的进阶技巧 在工业视觉检测和实时直播领域&#xff0c;稳定高效地采集视频流是核心需求。C#开发者常选择OpenCVSharp作为计算机视觉开发工具&#xff0c;但实际应用中总会遇到帧率不稳定、资源泄漏或参数配置不当…...

【Oracle篇】基于OGG 21c全程图形化实现9TB数据从Oracle 11g到19c的不停机迁移(上):微服务架构详解与微服务部署,及同步问题总览(第一篇,总共三篇)

&#x1f4ab;《博主主页》&#xff1a;    &#x1f50e; CSDN主页&#xff1a; 奈斯DB    &#x1f50e; IF Club社区主页&#xff1a; 奈斯、    &#x1f50e; 微信公众号&#xff1a; 奈斯DB &#x1f525;《擅长领域》&#xff1a;    &#x1f5c3;️ 数据库…...