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.rhkb.cn/news/241036.html

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

相关文章

DDoS攻击规模最大的一次

有史以来DDoS攻击规模最大的是哪一次&#xff1f; Google Cloud团队在2017年9月披露了一次此前未公开的DDoS攻击&#xff0c;其流量达 2.54Tbps&#xff0c;是迄今为止有记录以来最大的DDoS攻击。 在同时发布的另一份报告中&#xff0c;分析高端威胁团体的谷歌安全团队谷歌威胁…

Vray渲染效果图材质参数设置

渲染是创造出引人入胜视觉效果的关键步骤&#xff0c;在视觉艺术领域尤为重要。不过&#xff0c;渲染作为一个资源密集型的过程&#xff0c;每当面对它时&#xff0c;我们往往都会遭遇到时间消耗和资源利用的巨大挑战。幸运的是&#xff0c;有几种方法能够帮助我们优化渲染&…

网易云音乐 API

网易云音乐 API 网易云音乐 API灵感来自环境要求安装运行Vercel 部署操作方法 可以在Node.js调用支持 TypeScript使用文档功能特性更新日志单元测试SDK贡献者License 网易云音乐 API 网易云音乐 Node.js API service 灵感来自 disoul/electron-cloud-music darknessomi/musi…

Jira 宣布Data Center版涨价5%-15%,6年内第8次提价

近日&#xff0c;Atlassian官方面向合作伙伴发布2024年涨价通知&#xff1a; 自2024年2月15日起&#xff0c;旗下核心产品Jira Software、Confluence、Jira Service Management的DC版本&#xff08;Data Center版本&#xff09;价格提高5%-15%&#xff08;涨幅与坐席数阶梯相关…

【算法】串联所有单词的子串【滑动窗口】

题目 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。例如&#xff0c;如果 words ["ab","cd","ef"]&#xff0c; 那么 "abcd…

[NSSRound#16 Basic]RCE但是没有完全RCE

题目代码&#xff1a; <?php error_reporting(0); highlight_file(__file__); include(level2.php); if (isset($_GET[md5_1]) && isset($_GET[md5_2])) {if ((string)$_GET[md5_1] ! (string)$_GET[md5_2] && md5($_GET[md5_1]) md5($_GET[md5_2])) {i…

微店商品详情API(micro.item_get)的数据分析和挖掘

随着电商行业的迅猛发展&#xff0c;微店作为电商平台的重要组成部分&#xff0c;提供了丰富的API接口供开发者使用。其中&#xff0c;微店商品详情API&#xff08;micro.item_get&#xff09;是用于获取商品详情的接口&#xff0c;为数据分析和挖掘提供了大量有价值的数据源。…

Kafka-消费者-KafkaConsumer分析

与KafkaProducer不同的是&#xff0c;KafkaConsumer不是一个线程安全的类。 为了便于分析&#xff0c;我们认为下面介绍的所有操作都是在同一线程中完成的&#xff0c;所以不需要考虑锁的问题。 这种设计将实现多线程处理消息的逻辑转移到了调用KafkaConsumer的代码中&#x…

HTML 表单

文章目录 表单什么是表单GET和POST两种提交方式有什么不同?表单元素表单项外文本单行文本输入框单行文本密码框单选框复选框下拉列表框上传文件隐藏域填写邮箱填写电话填写数字填写日期进度条多行文本输入框提交按钮取消按钮 用户注册案例 表单 什么是表单 form:表单元素 此…

navigateTo失效-跳转不了页面解决办法!uniapp\vue

改了一个小时多的错误&#xff0c;跳转页面无论怎么样都跳转不了&#xff0c;有2个问题&#xff1a; 注意&#xff1a;uniapp的报错可以在console里检查&#xff01; 1.pages.json文件没有配置路径&#xff0c; 在pages:[ ]里面加 &#xff08;根据自己的路径进行修改 {&qu…

Python爬虫---scrapy框架---当当网管道封装

项目结构&#xff1a; dang.py文件&#xff1a;自己创建&#xff0c;实现爬虫核心功能的文件 import scrapy from scrapy_dangdang_20240113.items import ScrapyDangdang20240113Itemclass DangSpider(scrapy.Spider):name "dang" # 名字# 如果是多页下载的话, …

Byrdhouse AI实时语音翻译工具,可以在视频通话中翻译100多种语言

你是否曾经在跨国会议或与外国友人聊天时&#xff0c;因为语言不通而感到尴尬或困扰&#xff1f;是不是还在找可以实时翻译的软件或者APP&#xff1f;现在&#xff0c;有了这款语音翻译神器&#xff0c;一切都将变得简单&#xff01; 免费使用链接&#xff1a;https://byrdhous…

2809. 使数组和小于等于 x 的最少时间

2809. 使数组和小于等于 x 的最少时间 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/minimum-time-to-make-array-sum-at-most-x/?envTypedaily-question&envId2024-01-19 经典动态规划 class Solution { public:int minimumTime(vector<int&…

合并K个升序链表(LeetCode 23)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路方法一&#xff1a;顺序合并方法二&#xff1a;分治合并方法三&#xff1a;使用优先队列合并 参考文献 1.问题描述 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff…

uniapp踩坑之项目:canvas第一次保存是空白图片

在ctx.draw()回调生成图片&#xff0c;参考canvasToTempFilePath接口文档 // data imgFilePath: null,// 缓存二维码图片canvas路径//js // 首先在draw&#xff08;&#xff09;里进行本地存储 ...... ctx.draw(false, () >{uni.canvasToTempFilePath({ // 把画布转化成临时…

c JPEG 1D DCT

步骤&#xff1a; 1. 对yuv 88 数据 8行分别1D DCT 2, 用8行 1D DCT 得到的数据生成中间88 块 Zj 3,对Zj 的8列再 1D DCT 后生成8列,用这8列组合成8*8的2D DCT 系数 准备用此1D DCT程序代替以前写的2D DCT,看能减少多少编码时间。 看网上文章&#xff0c;ffmpeg用…

翻译: Streamlit从入门到精通七 缓存Cache控制缓存大小和持续时间

Streamlit从入门到精通 系列&#xff1a; 翻译: Streamlit从入门到精通 基础控件 一翻译: Streamlit从入门到精通 显示图表Graphs 地图Map 主题Themes 二翻译: Streamlit从入门到精通 构建一个机器学习应用程序 三翻译: Streamlit从入门到精通 部署一个机器学习应用程序 四翻译…

移动端开发进阶之蓝牙通讯(四)

移动端开发进阶之蓝牙通讯&#xff08;四&#xff09; 在移动端开发实践中&#xff0c;可能会要求在不同的设备之间切换&#xff0c;从而提升用户体验&#xff1b; 或者为了提升设备的利用率&#xff0c;实现设备之间的连接和协同工作&#xff1b; 不得不通过多端连接&#xf…

RT-Thread experimental 代码学习(1)thread_sample

RTOS的最基础功能是线程。 线程的调度是如何工作的&#xff1f;RT-thread官方的实验文档是最好的参考。 老规矩&#xff0c;先放法国人doxygen。 thread_sample 代码的调用关系图 有意思的是&#xff0c;RT有两种创建线程的方式 - 静态和动态&#xff0c;粗略的理解是&…

vue+elementui实现12个日历平铺,初始化工作日,并且可点击

<template><div class"app-container"><el-form :model"queryParams" ref"queryForm" size"small" :inline"true"><el-form-item label"年份" prop"holidayYear"><el-date-…