C#winform上位机开发学习笔记1-串口助手的ModbusCRC功能

1.首先自定义CRC校验函数

private UInt16 Crc_Check(byte[] Data, byte DataLEN){UInt16 CRC = 0xFFFF;for (byte i = 0; i < DataLEN; i++){ CRC ^= Data[i];for(byte j = 0; j < 8; j++){if((CRC & 0x0001) == 0x0001){CRC = (UInt16)((CRC >> 1) ^ 0xA001);}else{CRC = (UInt16)(CRC >> 1);}}}CRC = (UInt16)((CRC >> 8) + (CRC<<8));return CRC;}

2.在HEX发送函数中增加CRC缓存数组变量声明

byte[] Calculate_CRC = new byte[(Buf.Length - Buf.Length % 2) / 2];//CRC缓存区Calculate_CRC[i] = data[0];//CRC参数赋值//发送CRCif (checkBox25.Checked){UInt32 CRC = Crc_Check(Calculate_CRC, (byte)Calculate_CRC.Length);//crc计算byte CRC_H = (byte)(CRC >> 8);byte CRC_L = (byte)CRC;try{data[0] = CRC_L;serialPort1.Write(data, 0, 1);//发送低位data[0] = CRC_H;serialPort1.Write(data, 0, 1);//发送高位}catch{textBox1.AppendText("\r\n串口数据发送错误!\r\n");//textBox5.Text = "";//若出现错误不清空发送框的内容//串口按钮显示为关闭serialPort1.Close();button2.BackgroundImage = Properties.Resources.Image_CloseSerial;button2.Tag = "OFF";}}

3.完整串口发送代码

 //串口发送按钮private void button29_Click(object sender, EventArgs e){byte[] data = new byte[1];//发送函数需要定义数组首地址//发送格式为ASCIIif (!checkBox24.Checked)//复用框没有被选择时{try{//遍历用法foreach (byte Member in textBox5.Text)//循环函数{data[0] = Member;serialPort1.Write(data, 0, 1);//单字节发送}//发送回车换行if (checkBox26.Checked)//发空复选框{data[0] = 0x0D;//发送回车serialPort1.Write(data, 0, 1);data[0] = 0x0A;//发送换行serialPort1.Write(data, 0, 1);}}catch{textBox1.AppendText("\r\n串口数据发送错误!\r\n");//textBox5.Text = "";//若出现错误不清空发送框的内容//串口按钮显示为关闭serialPort1.Close();button2.BackgroundImage = Properties.Resources.Image_CloseSerial;button2.Tag = "OFF";}}//发送格式为HEXelse{//处理字符串string Buf = textBox5.Text;Buf = Buf.Replace("0x", string.Empty);//将buf中的0x替换为空格,消除0x的不规范书写方式Buf = Buf.Replace("0X", string.Empty);Buf = Buf.Replace(" ", string.Empty);byte[] Calculate_CRC = new byte[(Buf.Length - Buf.Length % 2) / 2];//CRC缓存区textBox5.Text = " ";//循环发送for (int i = 0; i < (Buf.Length - Buf.Length % 2) / 2; i++)//取余运算作用是防止用户输入的字符为奇数个{textBox5.AppendText(Buf.Substring(i * 2, 2) + " ");//Buf.Substring为Buf的子字符串,长度为2try{data[0] = Convert.ToByte(Buf.Substring(i*2,2),16);//将字符串转换为十六进制的整型serialPort1.Write(data, 0, 1);//单字节发送Calculate_CRC[i] = data[0];//CRC参数赋值}catch{textBox1.AppendText("\r\n串口数据发送错误!\r\n");//textBox5.Text = "";//若出现错误不清空发送框的内容//串口按钮显示为关闭serialPort1.Close();button2.BackgroundImage = Properties.Resources.Image_CloseSerial;button2.Tag = "OFF";}}//发送CRCif (checkBox25.Checked){UInt32 CRC = Crc_Check(Calculate_CRC, (byte)Calculate_CRC.Length);//crc计算byte CRC_H = (byte)(CRC >> 8);byte CRC_L = (byte)CRC;try{data[0] = CRC_L;serialPort1.Write(data, 0, 1);//发送低位data[0] = CRC_H;serialPort1.Write(data, 0, 1);//发送高位}catch{textBox1.AppendText("\r\n串口数据发送错误!\r\n");//textBox5.Text = "";//若出现错误不清空发送框的内容//串口按钮显示为关闭serialPort1.Close();button2.BackgroundImage = Properties.Resources.Image_CloseSerial;button2.Tag = "OFF";}}}//发送完清空if (checkBox23.Checked)//发空复选框{textBox5.Text = "";}}

4.结果测试

自定义的串口助手与SSCOM互为通信,发送相同十六进制数据情况下,查看两者CRC校验码是否相同,相同说明CRC校验成功

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

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

相关文章

SQL 最大连续合格次数 最大连胜记录次数 最大连败记录次数

有这样一个问题&#xff0c;工厂中要统计某个供应商送货检验的情况&#xff0c;依照其连续合格次数&#xff0c;决定是否免检&#xff0c;不使用游标或者循环&#xff0c;如何写这个sql。 此情景也可以用于统计连胜记录等 先要学习一下 窗函数LAG&#xff0c;指的是按分组和排…

vue 解决el-table 表体数据发生变化时,未重新渲染问题

效果图父组件中数量改变后总数重新计算 子组件完整代码 <template><el-tableshow-summaryref"multipleTable"v-bind"$props"selection-change"handleSelectionChange"row-click"handleRowClick":summary-method"getSum…

经典目标检测YOLO系列(二)YOLOV2的复现(2)正样本的匹配、损失函数的实现及模型训练

经典目标检测YOLO系列(二)YOLOV2的复现(2)正样本的匹配、损失函数的实现及模型训练 我们在之前实现YOLOv1的基础上&#xff0c;加入了先验框机制&#xff0c;快速的实现了YOLOv2的网络架构&#xff0c;并且实现了前向推理过程。 经典目标检测YOLO系列(二)YOLOV2的复现(1)总体…

【Go面试向】rune和byte类型的认识与使用

【Go】rune和byte类型的认识与使用 大家好 我是寸铁&#x1f44a; 总结了一篇rune和byte类型的认识与使用的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; byte和rune类型定义 byte,占用1个字节&#xff0c;共8个比特位&#xff0c;所以它实际上和uint8没什么本质区别,它表示…

Joern环境的安装(Windows版)

Joern环境的安装(Windows版) 网上很少有关于Windows下安装Joern的教程&#xff0c;而我最初使用也是装在Ubuntu虚拟机中&#xff0c;这样使用很占内存&#xff0c;影响体验感。在Windows下使用源码安装Joern也是非常简单的过程&#xff1a; 提前需要的本地环境&#xff1a; …

基于Java+SSM框架的办公用品管理系统详细设计和实现【附源码】

基于JavaSSM框架的办公用品管理系统详细设计和实现【附源码】 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定…

GO 中如何防止 goroutine 泄露

文章目录 概述如何监控泄露一个简单的例子泄露情况分类chanel 引起的泄露发送不接收接收不发送nil channel真实的场景 传统同步机制MutexWaitGroup 总结参考资料 今天来简单谈谈&#xff0c;Go 如何防止 goroutine 泄露。 概述 Go 的并发模型与其他语言不同&#xff0c;虽说它…

蓝天采集器,功能逆天的网站数据抓取神器,轻松助你成为采集达人,附带搭建配置文档

源码介绍 蓝天采集器是一款专为web服务器打造的数据采集神器。与市面上常见的桌面端采集工具&#xff08;如火车头等&#xff09;相比&#xff0c;蓝天采集器在易用性、上手成本和灵活性方面更胜一筹。它部署简便&#xff0c;无需复杂的设置&#xff0c;即可迅速融入您的web服…

详解IP安全:IPSec协议簇 | AH协议 | ESP协议 | IKE协议_ipsec esp

目录 IP安全概述 IPSec协议簇 IPSec的实现方式 AH&#xff08;Authentication Header&#xff0c;认证头&#xff09; ESP&#xff08;Encapsulating Security Payload&#xff0c;封装安全载荷&#xff09; IKE&#xff08;Internet Key Exchange&#xff0c;因特网密钥…

storm统计服务开启zookeeper、kafka 、Storm(sasl认证)

部署storm统计服务开启zookeeper、kafka 、Storm&#xff08;sasl认证&#xff09; 当前测试验证结果&#xff1a; 单独配置zookeeper 支持acl 设置用户和密码&#xff0c;在storm不修改代码情况下和kafka支持当kafka 开启ACL时&#xff0c;storm 和ccod模块不清楚配置用户和密…

2018年认证杯SPSSPRO杯数学建模A题(第二阶段)海豚与沙丁鱼全过程文档及程序

2018年认证杯SPSSPRO杯数学建模 基于聚类分析的海豚捕食合作策略 A题 海豚与沙丁鱼 原题再现&#xff1a; 沙丁鱼以聚成大群的方式来对抗海豚的捕食。由于水下光线很暗&#xff0c;所以在距离较远时&#xff0c;海豚只能使用回声定位方法来判断鱼群的整体位置&#xff0c;难…

第4章 C++的类

类的保留字&#xff1a;class、struct 或 union 可用来声明和定义类。类的声明由保留字class、struct或union加上类的名称构成。类的定义包括类的声明部分和类的由{}括起来的主体两部分构成。类的实现通常指类的函数成员的实现&#xff0c;即定义类的函数成员。 class 类名;//…

C#,字符串匹配(模式搜索)Sunday算法的源代码

Sunday算法是Daniel M.Sunday于1990年提出的一种字符串模式匹配算法。 核心思想&#xff1a;在匹配过程中&#xff0c;模式串并不被要求一定要按从左向右进行比较还是从右向左进行比较&#xff0c;它在发现不匹配时&#xff0c;算法能跳过尽可能多的字符以进行下一步的匹配&…

港科夜闻|香港科大团队研发多功能,可重构和抗破坏单线感测器阵列

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大团队研发多功能、可重构和抗破坏单线感测器阵列。研究人员开发出一种受人类听觉系统启发的感测器阵列设计技术。透过模仿人耳根据音位分布来区分声音的能力&#xff0c;这种新型感测器阵列方法可能优化感测器阵列…

Yolov8_使用自定义数据集训练模型1

前面几篇文章介绍了如何搭建Yolov8环境、使用默认的模型训练和推理图片及视频的效果、并使用GPU版本的torch加速推理、导出.engine格式的模型进一步利用GPU加速&#xff0c;本篇介绍如何自定义数据集&#xff0c;这样就可以训练出识别特定物体的模型。 《Yolov8_使用自定义数据…

innoDB存储引擎

1.逻辑存储结构 行数据->行->页->区->段->表空间 表空间(ibd文件)&#xff0c;一个mysql实例可以对应多个表空间&#xff0c;来存储记录&#xff0c;索引等数据。 段&#xff1a;分为数据段和索引段&#xff0c;回滚段&#xff0c;数据段就是B树的叶子节点&am…

HR3D+HRAuido+HRUI+HR3D_Plugins(游戏引擎源码)

国内知名游戏公司开发的游戏引擎&#xff0c;简洁高效&#xff0c;代码值得参考。包含了这几部分&#xff1a;HR3DHRAuidoHRUIHR3D_Plugins HR3DHRAuidoHRUIHR3D_Plugins&#xff08;游戏引擎源码&#xff09; 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1…

使用xbindkeys设置鼠标侧键

1.安装如下包 sudo apt install xbindkeys xautomation 2.生成配置文件 xbindkeys --defaults > $HOME/.xbindkeysrc 3.确定侧键键号 在终端执行下面的代码&#xff1a; xev | grep button 此时会出现如下窗口&#xff0c;将鼠标指针移动到这个窗口上&#xff1a; 单…

【机器学习】调配师:咖啡的完美预测

有一天&#xff0c;小明带着一脸期待找到了你这位数据分析大师。他掏出手机&#xff0c;屏幕上展示着一份详尽的Excel表格。“看&#xff0c;这是我咖啡店过去一年的数据。”他滑动着屏幕&#xff0c;“每个月的销售量、广告投入&#xff0c;还有当月的气温&#xff0c;我都记录…

【MYSQL】事务隔离级别

脏读、幻读、不可重复读 脏读 一个事务正在对一条记录做修改&#xff0c;在这个事务完成并提交前&#xff0c;另一个事务也来读取同一条记录&#xff0c;读取了这些未提交的“脏”数据&#xff0c;并据此做进一步的处理&#xff0c;就会产生未提交的数据依赖关系。这种现象被形…