Modbus RTU校验码CRC16全字节查表的VB6实现方法

news2025/1/12 4:01:01

全字节表比半字节表数据精简,比纯计算速度快,实现起来方便,但是在VB6下或是在普通单片机上要变通处理,因为双字节变量处理会溢出而数据失真。

先看一下CSDN上网友XCS101的C程序 CRC-16/MODBUS 算法的三种实现方法_crc16modbus校验计算方法_xcs101的博客-CSDN博客

/* 半字节CRC16(Dow_右移逆序) 0xA001 余式表*/
const unsigned int CRC_16_Tab[16] =
{
  0x0000, 0xCC01, 0xD801, 0x1400, 0xF001, 0x3C00, 0x2800, 0xE401,
  0xA001, 0x6C00, 0x7800, 0xB401, 0x5000, 0x9C01, 0x8801, 0x4400
};

unsigned int ModBusCRC16(unsigned char *data, unsigned char len)
{
  unsigned char i,temp;
  unsigned int crc_16 = 0xffff;
  for(i=0;i<len;i++)
  {
    temp = ((unsigned char)(crc_16&0x000F))^(*data&0x0F);
    crc_16 >>= 4;
    crc_16 ^= CRC_16_Tab[temp];
    temp = ((unsigned char)(crc_16&0x000F))^(*data>>4);
    crc_16 >>= 4;
    crc_16 ^= CRC_16_Tab[temp];
  }
  return crc_16;
}

再基于同数据表的VB6程序表述方法

Private Sub Command4_Click()
'* 半字节CRC16(Dow_右移逆序) 0xA001 余式表*
Dim TestString As String
Dim I As Integer, Temp As Integer
Dim PP As Integer
Dim CRCLo As Byte, CRCHi As Byte, TCRC As Byte

Dim LTable()
LTable() = Array( _
  "&H0000", "&HCC01", "&HD801", "&H1400", "&HF001", "&H3C00", "&H2800", "&HE401", _
  "&HA001", "&H6C00", "&H7800", "&HB401", "&H5000", "&H9C01", "&H8801", "&H4400")

TestString = Label1.Caption
TestString = "010303E80002"

CRCHi = &HFF: CRCLo = &HFF

For I = 1 To Len(TestString) / 2
    PP = Val("&H" + Mid$(TestString, I * 2 - 1, 2))
    Temp = (CRCLo And &HF) Xor (PP And &HF)
    
    CRCLo = CRCLo \ 2 ^ 4
    TCRC = (CRCHi And &HF)
    TCRC = TCRC * 2 ^ 4: CRCLo = CRCLo Or TCRC
    CRCHi = CRCHi \ 2 ^ 4
    
    CRCLo = CRCLo Xor (Val("&H" + (Right$(LTable(Temp), 2))))
    CRCHi = CRCHi Xor (Val("&H" + (Mid$(LTable(Temp), 3, 2))))
    
    Temp = (CRCLo And &HF) Xor (PP \ 2 ^ 4)
    
    CRCLo = CRCLo \ 2 ^ 4
    TCRC = (CRCHi And &HF)
    TCRC = TCRC * 2 ^ 4: CRCLo = CRCLo Or TCRC
    CRCHi = CRCHi \ 2 ^ 4

    CRCLo = CRCLo Xor (Val("&H" + (Right$(LTable(Temp), 2))))
    CRCHi = CRCHi Xor (Val("&H" + (Mid$(LTable(Temp), 3, 2))))
Next I

Text1.Text = Hex$(CRCLo) + Hex$(CRCHi)

End Sub

原理是一样的,逻辑也是一样的,除了对字符串字节处理不同外,对CRC16值的处理也不同。在VB6里,C原本Usinged Integer的CRC16值,要改成高低各8位的CRCHi和CRCLo来存储并计算。

关注点:

1、 右移位4位时CRCLo右移4位,CRCHi右移4位到中间变量,然后CRCLo与中间变量或形成新的CRCLo,CRCHi直接右移4位,完成CRCHi和CRCLo的完整移位。

2、与查表中所得进行异或计算时,CRCLo与表项数据的低2位进行异或,CRCHi则与表项数据的高2位异或。

3、左移4位参照右移4位,由中间变量存储临时4位。

经过变换处理,VB6全字节查表计算CRC16就实现了。至此,CRC16纯计算、半字查表和全字节查表在VB6中的实现方法都实现并记录在了笔记。

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

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

相关文章

风险区分度—IV、KS和分布

IV和KS是风控中常用的评估指标&#xff0c;用于衡量变量的预测能力和区分度。一般来说&#xff0c;IV和KS值越大&#xff0c;表示该变量的预测能力越强。本文从IV和KS以及两者之间的关系方面作一些思考。 一、IV值 一般来说&#xff0c;IV计算用于筛选变量&#xff0c;常用来评…

记一次现场找不到配置的神奇报错,(其实配置是完整的)

记一次现场找不到配置的神奇报错&#xff0c;&#xff08;其实配置是完整的&#xff09; 问题的原因为因为配置文件中符号的问题。 报错找不到url1 **Notepad**打开的文件 如图是两份看起来一模一样的配置&#xff0c;其中一个就会报错找不到某某配置。 实际有细小的差别 …

纷享销客稳居2022 H2 SFA SaaS 本土CRM厂商市场份额 TOP 1

近期&#xff0c;国际知名研究机构IDC公布了2022年下半年《中国客户关系管理(CRM)SaaS市场跟踪研究报告》&#xff0c;报告全面解析了中国CRM SaaS以及细分市场SFA SaaS的市场现状&#xff0c;并对全球各大厂商在中国SFA市场的份额占比进行了排名。连接型CRM开创者纷享销客在SF…

AAAI 最佳论文列表(1984→2023最新)附论文下载

明天AAAI全文截稿了&#xff0c;不知道大家的论文投的咋样啦&#xff1f;我不得不提一句&#xff0c;今年的AAAI投稿量又破新高了&#xff0c;快14,000&#xff01;卷哭... 不过这个投稿量也在意料之中&#xff0c;AAAI属于中国计算机学会CCF的A类国际学术会议&#xff0c;在人…

Unity zSpace 开发

文章目录 1.下载 zSpace 开发环境1.1 zCore Unity Package1.2 zView Unity Package 2. 导入工程3. 发布设置4.功能实现4.1 用触控笔来实现对模型的拖拽&#xff1a; 5. 后续更新 1.下载 zSpace 开发环境 官网地址 1.1 zCore Unity Package zSpace 开发核心必须 1.2 zView …

Nacos使用SpringCloudAlibaba+Dubbo实现

Nacos简介 Nacos是阿里的一个开源产品&#xff0c;它是针对微服务架构中的服务发现、服务治理、配置管理的综合型解决方案。 官方介绍是这样的&#xff1a; Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您实现动态服务发现、…

【QT】 Word模板编辑、转PDF格式

很高兴在雪易的CSDN遇见你 ,给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享基于QT进行Word模板编辑以及Word转PDF的技术,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录 …

微信开发之一键退出群聊的技术实现

简要描述&#xff1a; 退出群聊 请求URL&#xff1a; http://域名地址/quitChatRoom 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选类型说明wI…

微信小程序实现左滑删除

一、效果 二、代码 实现思路使用的是官方提供的 <movable-area> <movable-view> Page({/*** 页面的初始数据*/data: {pushedData:[{messageTitle:饼干,messageContent:饼干爱吃}],//已推送数据},/*** 生命周期函数--监听页面加载*/onLoad() {},/*** 生命周期函数-…

设计列表和超链接

在网页中&#xff0c;大部分信息都是列表结构&#xff0c;如菜单栏、图文列表、分类导航、新闻列表、栏目列表等。HTML5定义了一套列表标签&#xff0c;通过列表结构实现对网页信息的合理排版。另外&#xff0c;网页中还包含大量超链接&#xff0c;通过它实现网页、位置的跳转&…

【计算机视觉|生成对抗】带条件的对抗网络进行图像到图像的转换

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Image-to-Image Translation with Conditional Adversarial Networks 链接&#xff1a;Image-to-Image Translation with Conditional Adversarial Networks | IEEE Conference Publicati…

四、Dubbo扩展点加载机制

四、Dubbo扩展点加载机制 4.1 加载机制概述 Dubbo良好的扩展性与框架中针对不同场景使用合适设计模式、加载机制密不可分 Dubbo几乎所有功能组件都是基于扩展机制&#xff08;SPI&#xff09;实现的 Dubbo SPI 没有直接使用 Java SPI&#xff0c;在它思想上进行改进&#xff…

六轴机械臂码垛货物堆叠仿真

六轴机械臂码垛货物堆叠仿真 1、建立模型与仿真 clear,clc,close all addpath(genpath(.)) %建立模型参数如下&#xff1a; L(1) Link( d, 0.122, a , 0 , alpha, pi/2,offset,0); L(2) Link( d, 0.019 , a ,0.408 , alpha, 0,offset,pi/2); L(3) Link( d, …

C++的stack和queue+优先队列

文章目录 什么是容器适配器底层逻辑为什么选择deque作为stack和queue的底层默认容器优先队列优先队列的模拟实现stack和queue的模拟实现 什么是容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总 结)&#xff0c;…

【内联函数】

这里写目录标题 内联函数一、指定内联函数的方法很简单&#xff0c;只需要在函数定义处增加 inline 关键字一般是将非常短小的函数声明为内联函数内联函数与宏定义例题 内联函数 内联函数也称内嵌函数&#xff0c;它主要是解决程序的运行效率。 函数调用需要建立栈内存环境&am…

小白带你学习linux的MongoDB(三十四)

目录 一、概述 1、相关概念 2、特性 二、应用场景 三、安装 四、目录结构 五、默认数据库 1、admin&#xff1a; 2、local: 3、config: 六、数据库操作 1、库操作 2、文档操作 七、MongoDB数据库备份 1、备份命令 2、回数据库删除…

数据库内日期类型数据大于小于条件查找注意事项

只传date格式的日期取查datetime的字段的话默认是 00:00:00 日期类型字符串需要使用 ’ ’ 单引号括住 使用大于小于条件查询某一天的日期数据 前后判断条件不能是同一天 一个例子 数据库内数据&#xff1a; 查询2023-08-14之后的数据&#xff1a; select * from tetst…

Linux 内核第一版 (v0.01) 开源代码解读

探索Linux v0.01的内部结构&#xff0c;Linux内核经常被认为是一个庞大的开源软件。在撰写本文时&#xff0c;最新版本是v6.5-rc5&#xff0c;包含36M行代码。不用说&#xff0c;Linux是几十年来许多贡献者辛勤工作的成果。 Linux 内核首个开源版本 (v0.01) 的体积非常小&…

HBuilderX

HX 简介下载安装 简介 HBuilderX 是一款由 DCloud 开发的集成开发环境 (IDE)&#xff0c;主要用于前端开发和移动应用开发。它基于 Visual Studio Code 平台&#xff0c;针对 Web 开发、小程序开发、移动端开发等提供了丰富的功能和插件。 DCloud官网: https://www.dcloud.io …

剑指offer57-II.和为s的连续正数序列

看完题脑子里闪过了暴力法&#xff0c;就是从1开始往后累加&#xff0c;直到累加和等于或大于target&#xff0c;如果等于就放进数组&#xff0c;如果大于就从2开始加&#xff0c;但是这种想法只是闪过一下&#xff0c;因为我觉得加上填充数组需要3层循环肯定会超时&#xff0c…