python上位机串行通信接收字节数据的校验处理-以crc16-modbus为例

在串行通信中,接收到的数据是否正确,一般用CRC校码的方式来完成。上位机向下位机发送数据时,需要加上校验码,同理,下位机向上位机上报数据时,也需要加上校验码。

校验码的计算方法有很多,比较简单的是奇偶校验,相对来说容易计算,且数据传输的可靠度也还不错。比较可靠的方法用CRC校验,CRC的原理在此不详述,有需要的自行在CSDN上找答案。

这里需要说的是,接收到数据后,如何对该数据是否正确进行校验。

一、从串口接收到原始数据的不同表现形式

作为上位机,从串口收到的数据是这样的:

注意看图片的第3行和第4行。第3行是显示的字节码,第4行是转为16进制数显示,两者是不同的。

寻么在做校验时,是以哪个为准呢。

我们打开 字节数据校验码计算器,可以参考CRC(循环冗余校验)在线计算_ip33.com,看计算的结果

貌似是以第4行显示的结果进行的计算,我们收到的原始数据不是这个样子,似乎这种方法不可行。

其实有这个困惑的主要原因,是对字节码数据与16进制数据理解不深不透造成的。我们通过串口助手来重新看一下这个过程。首先我以十六进制的形式进行收发。

可以看到这个数据和程序收到的数据是一致的,对应的16进制数据就是A1 61 00 09 B2,转换成二进制再看一下:

data = b'\xa1a\x00\t\xb2'
binary_str1 = ' '.join(f'{byte:08b}' for byte in data)
display(binary_str1)

得到的结果是:'10100001 01100001 00000000 00001001 10110010'

我们看到他和16进制数据是一一对应的。

以上说了半天,只是为了说明我们接收到的数据的表现形式,以加深我们对校验处理的理解。

二、校验

校验涉及两个问题,一是将接收到的原始数据截取成信息数据和校验码的形式;二是将信息数据用校验码生成工具重新计算生成校验码;三是对比两个校验码,看其是否一致。

def CRC16_Modbus_verification(self, rx_buf: bytes)->bool:"""使用CRC16_Modbus校验接收到的数据是否正确Args:rx_buf (bytes): 从串口接收到的数据,最后两个字节,高字节为crc_l,低字节为crc_hReturns:bool: 0,校验失败,1校验成功"""crc_h,crc_l = self.CRC16_Modbus(rx_buf[:-2])                      # 校验#print('rx_buf[-2:-1]:',rx_buf[-2:-1])if crc_l == rx_buf[-2:-1] and crc_h == rx_buf[-1:]:return 1else:return 0

使用上述函数,直接可以将接收到的字节码输入,自动出来计算结果,以决定数据是否采用。

以上简要描述了接收原始数据的表现形式与校验方法,当然处理这种校验的方法有很多,实际项目中,上位机开发与下位机开发要进行充分的沟通,使用相同的校验算法,这样才能通过串口进行有效通信。

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

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

相关文章

C# WinForm —— 23 Timers.Timer 组件介绍与使用

1. 简介 System.Timers.Timer 计时器 轻量 每隔一段时间触发Elapsed事件,执行操作(不是由UI线程执行的),即使事件中执行了比较耗时的操作,也不会造成 UI 失去响应 如果要获取服务器的计时功能的话,可以使用System.Timers.Timer …

PLC电脑编程软件怎么下?详细指南与技巧解析

PLC电脑编程软件怎么下?详细指南与技巧解析 在工业自动化领域,PLC(可编程逻辑控制器)扮演着至关重要的角色。为了对PLC进行编程和调试,我们需要使用专门的PLC电脑编程软件。本文将详细介绍如何下载并安装这些软件&…

轻松记录收支明细,智能筛选并统计买菜历史记录:一键掌握家庭财务

在繁忙的生活中,你是否曾为家庭财务的琐碎而烦恼?买菜、购物、日常开销……每一笔支出都似乎难以捉摸,让你在月底对账时头疼不已。现在,我们为你带来了一款全新的财务记录工具,让你轻松记录收支明细,智能筛…

2024华为OD机试真题-推荐多样性-C卷D卷-200分-(C++/Java/Python)

【华为OD机试】-(A卷+B卷+C卷+D卷)-2024真题合集目录 【华为OD机试】-(C卷+D卷)-2024最新真题目录 题目描述 推荐多样性需要从多个列表中选择元素,一次性要返回 N 屏数据(窗口数量),每屏展示 K 个元素(窗口大小),选择策略: 各个列表元素需要做穿插处理,即先从第一个…

关于如何在Arch Linux上编写自己的第一个module

前一段时间一直想深入学习编写一个module插入到自己的内核当中,但是网上的资料基本上全都针对的Ubuntu和Debian等流行的Linux发行版,这里打算简单的记录一波博客。 啥是Module?(着急可不看) 众所周知:现代宏内核架构的操作系统都会借鉴微内核…

C语言| 100元换成50元、20元、10元有几种方案?

/* 求出用50元、20元和10元换算100元有几种方式? 100元可以换两张50元,可以换5张20元,可以换10张10元。 用到for循环去实现,换算的最大范围分别是2 5 10 最中间再嵌套一个if,利用100 50*wushi20*ershi10*shi判断&a…

crbug/1173575

需要新建一个前端工程,前端人员从之前的一个工程复制过来,修改了端口号,删除了不适合的代码,打算从空工程开始开发。一切顺利,npm run dev,访问浏览器,结果页面出不来。怀疑删除了不该删除的文件…

Kotlin使用Dagger2但无法生成对应类 Unresolved reference: DaggerMyComponent

Dagger2无法生成对应类 Unresolved reference: DaggerMyComponent 解决: 在gradle.properties中设置 kapt.incremental.apt false参考链接: https://www.jianshu.com/p/f79003a5e6ba

vcruntime140.dll丢失如何安装,附找不到vcruntime140.dll的六种解决方法

vcruntime140.dll是一个动态链接库文件,属于Microsoft Visual C Redistributable Packages的一部分,专为Visual Studio 2015开发环境设计。它提供了C运行时库(CRT)中的一些关键功能,以及一些额外的Microsoft特定的运行…

0基础前端理论:揭开网页构建与交互的奥秘

0基础前端理论:揭开网页构建与交互的奥秘 在数字化时代,前端技术已经成为构建现代网页和应用程序不可或缺的一部分。对于零基础的学习者来说,理解前端理论是迈向成功的关键一步。本文将从四个方面、五个方面、六个方面和七个方面深入探讨0基…

【数据库系统原理】函数依赖与范式

在数据库设计中,范式(Normal Forms, NF)是用来规范化数据库表结构,以减少冗余数据和提高数据一致性与完整性的重要工具。 函数依赖 完全函数依赖与部分函数依赖 完全函数依赖 定义: 完全函数依赖表示的是在一个关系…

Java排序算法汇总篇,八种排序算法

排序算法汇总: Java排序算法(一):冒泡排序 Java排序算法(二):选择排序 Java排序算法(三):插入排序 Java排序算法(四):快速排序 Java排序算法(五):归并排序 Java排序算法(六):希尔排序 Java排序算法(…

18.Redis之哨兵

1.哨兵机制的介绍 通过自动化的手段,来解决主节点挂了的问题~~ 哨兵机制, 是通过独立的 进程 来体现的.和之前 redis-server 是不同的进程!! redis-sentine| 不负责存储数据,只是对其他的 redis-server 进程起到监控的效果~~ 通常哨兵节点,也会搞一个集合~~(多个哨兵节点构成的…

【Pr学习】01新建项目起步

【Pr学习】01新建项目起步 1、新建项目2.序列设置2.1新建序列2.2序列参数讲解2.3自定义设置 3.PR窗口认识3.1 项目窗口3.2 源窗口2.4 保存面板 4.剪辑导入4.1 素材导入4.2 视图切换4.3 时间轴4.4轨道工具4.5 节目窗口素材导入 5.基础操作5.1 取消视频音频链接5.2 单独渲染&…

Qos令牌桶算法:笔记0601

令牌桶 令牌:目前看到2种表述,csdn表示一个令牌代表一个字节,51cto是一个令牌代表一个bit。51cto上关于cisco qos算法描述多表达为一个令牌一个bit (不知道rfc上咋表达的懒得去查了,主打一个好读书不求甚解,感觉应该是…

[无监督学习] 11.详细图解LSA

LSA LSA(Latent Semantic Analysis,潜在语义分析)是一种自然语言处理技术。作为一种降维算法,它常被用于信息搜索领域。使用 LSA 能够从大量的文本数据中找出单词之间的潜在关联性。 概述 LSA 是在 1988 年被提出的算法&#xff…

Sqoop与Shell脚本数据迁移实战

文章目录 前言一、sqoop实战示例1. 获取所有数据库2. 获取指定数据库的所有表3. 查询数据4. 把指定数据库的所有表导入指定hive数据库5. 把指定表导入hive数据库的指定表6. 查询数据导入到指定表 二、shell脚本实战示例1. shell脚本2. 解释 总结 前言 在数据驱动的时代&#x…

AI产品导航站

1、AI产品导航站 (chat2ai.cn)

更新mirh connect 内置derby数据库密码

更新mirh connect 内置derby数据库密码 1、下载derby连接客户端 https://archive.apache.org/dist/db/derby/ 选择任意版本即可,比如 https://archive.apache.org/dist/db/derby/db-derby-10.14.2.0/db-derby-10.14.2.0-bin.zip 2、连接mirh文件数据库 1、把mi…

UnityAPI学习之游戏物体的方法使用

目录 游戏物体 创建游戏物体的三种方式 组建的获取和查找 游戏物体的方法与其他成员变量 游戏物体的生成 游戏物体的激活状态/标签(tag)/层级(layer) 游戏物体的激活与失活 游戏物体的查找 1. 名称查找(Find) 2. 通过标签查找游戏物体(FindGameObjectWithT…