2021SC@SDUSC

CRC8Util 类

这个类主要描写了如何利用串口数据对柜子的状态进行操作

    static int crc8_maxim(int[] data, int length) {int end = length;int i, j = 0;int crc = 0;while (length > 0) {crc ^= data[j ++];for (i = 0; i < 8; i ++) {if ((crc & 1) == 1) {crc = (crc >> 1) ^ 0x8C; // 0x8C = reverse 0x31} else {crc >>= 1;}}length--;}data[end] = crc;return crc;}

本项目在使用的CRC-8/MAXIM,它的参数模型为x8+x5+x4+1。所以,CRC校验的等效多项式是: CRC = x8 + x5 + x4 + 1

原理解析:
for (i = 0; i < 8; i ++)数据往左移了8位,因此需要计算8次。使用if ((crc & 1) == 1)进行最高位的判断,如果最高位为1,不需要异或,往左移一位,然后与0x8C异或,如果最高位为0时,不需要异或,整体数据往左移一位。最后可以得到相应的校验数据。

    static boolean checkCrc(int[] data) {if (data.length <= 1) {return false;}int end = data[data.length - 1];int check = crc8_maxim(data, data.length - 1);return end == check;}}

调用crc8_maxim()函数 校验Crc 的结果,最后一位是校验位

public static int[] getUnLockCRC8Data(int tableNum, int lockNum) {int[] data = new int[] {0xAA, 0x55, 0x03, tableNum, 0x50, lockNum, 0x00};CRC8Util.crc8_maxim(data, 6);return data;}public static String getUnLockCrc8String(int tableNum, int lockNum) {int[] temp = getUnLockCRC8Data(tableNum, lockNum);StringBuffer buffer = new StringBuffer();for (int i = 0; i < temp.length; i ++) {buffer.append(temp[i] < 16 ? ("0" + Integer.toHexString(temp[i])) : Integer.toHexString(temp[i]));}return buffer.toString();}

getUnLockCRC8Data()方法中,tableNum为锁控版编号,lockNum为锁编号,通过这两个参数获得UnLockCRC8数据,并将其转换成字符串,获取解锁命令。

static boolean getLockState(int[] retData, int lockNum) {lockNum--;int byteNum = lockNum / 8;int bitNum = lockNum % 8;int checkBit = 1 << bitNum;int tempByte = retData[5 + byteNum];return (checkBit & tempByte) != checkBit;}

retData为串口返回的数据, RLC-18E对应9字节,RLC-24E对应10字节
lockNum为锁编号,从1开始,最大24
只有当retData和lockNum相匹配,符合要求规范时,快递柜才能拥有开锁的状态。
此方法从响应值中获取某锁的状态。

public static boolean checkLockRet(int[] retData, int tableNum, int lockNum) {if (!checkResponseForm(retData, tableNum)) {System.out.println("数据格式错误");return false;}return getLockState(retData, lockNum);}

使用if (!checkResponseForm(retData, tableNum))检验数据格式是否错误,如果格式错误直接返回false,接着调用getLockState()函数检查开锁命令的响应值,验证锁是否打开。true表示锁已开,false表示锁未开。

    static boolean checkResponseForm(int[] retData, int tableNum) {if (retData[0] != 0xAA || retData[1] != 0x55 || retData[3] != tableNum || retData[2] + 4 != retData.length ) {return false;}return checkCrc(retData);}

此方法检查串口的响应的数据格式,包括(两个帧头,版地址,校验位,数据总长度)。其中,0xAA为帧头1,0x55为帧头2,tableNum为板地址,retData.length为数据长度,通过或运算,如果有一项不符合要求则返回false。最后通过checkCrc(retData)计算校验位是否正确。

2019级软件工程应用与实践-人工智能快递柜(代码分析11)相关推荐

  1. 2019级软件工程应用与实践-人工智能快递柜(代码分析2)

    2021SC@SDUSC 第一篇博客中学习了Android Studio的基本使用方式. 第二篇主要是利用了第一周的部分时间和第二周的全部时间来学习Android开发所需要的语法,通过学习,终于可以看 ...

  2. 山东大学2019级软件工程应用与实践——基于人工智能的多肽药物分析问题(七)

    2021SC@SDUSC 基于人工智能的多肽药物分析问题 主题:蛋白质预训练模型 学习论文: <ProtTrans: Towards Cracking the Language of Life' ...

  3. 山东大学2019级软件工程应用与实践——基于人工智能的多肽药物分析问题(十二)

    2021SC@SDUSC 基于人工智能的多肽药物分析问题 主题:蛋白质预训练模型(6) 代码分析 Benchmark Section ProtTrans/Benchmark/ProtAlbert.ip ...

  4. 山东大学2019级软件工程应用与实践——基于人工智能的多肽药物分析问题(八)

    2021SC@SDUSC 基于人工智能的多肽药物分析问题 主题:蛋白质预训练模型(2) 代码分析 根据使用方法,将按照以上顺序对每部分代码进行分析. 特征提取 : Embedding Section ...

  5. 人工智能研究中心快递柜——代码分析七

    2021SC@SDUSC 目录 index.wxml index.js 本次分析项目中柜子的定位功能的实现. index.wxml 在微信官方开发文档中,提供了map组件,通过对wx.createMa ...

  6. 人工智能研究中心快递柜——代码分析八

    2021SC@SDUSC 本次开始介绍柜子的具体使用功能的实现. 由于关于wxml方面都是使用view标签设置相应参数,进行展示故不做具体分析,主要是对 wx:if的运用,合理使用js中传入的数据参数 ...

  7. 山东大学软件工程应用与实践——GMSSL开源库(四)——SM9数字签名算法及验证的源代码分析

    2021SC@SDUSC 目录 一.引言 二.密钥的生成数字签名与签名验证相关代码 1.判定函数 2.签名的初始化函数 3.签名执行函数 4.真正的签名函数 5.签名验证初始化函数 6.签名验证执行函 ...

  8. 软件工程应用与实践(15)——请求与响应

    2021SC@SDUSC 文章目录 一.概述 二.源码分析 2.1 响应 2.2 请求 三.总结 一.概述 在老年健康知识图谱系统中,后端与前端的交互是很重要的,在前端向后端发送请求的过程中,后端需要 ...

  9. 《3D数学基础》实践1 向量类代码分析

    理解数学,理解代码! 大家好,我是老G! 今天为大家带来<3D数学基础>系列视频. 主要讲解:游戏开发中用到的3D数学知识,包括:定义,定理,推论. 也包括他们的推导过程,以及应用举例. ...

  10. 山东大学软件工程应用与实践——GMSSL开源库(一) ——WINDOWS下GMSSL的安装与编译的超详细保姆级攻略

    2021SC@SDUSC GMSSL简介 GmSSL是一个开源的密码工具箱,支持SM2/SM3/SM4/SM9/ZUC等国密(国家商用密码)算法.SM2国密数字证书及基于SM2证书的SSL/TLS安全 ...

最新文章

  1. linux vim6,VIM6:linux终端下的英文字典--SDCV
  2. debian手动安装java两种方法
  3. python使用imbalanced-learn的InstanceHardnessThreshold方法进行下采样处理数据不平衡问题
  4. 为什么使用RLC表测量电感在不同的频率测量值不同呢?
  5. 几个必知的python小知识
  6. 设置centos6 yum源为光盘
  7. C#并发编程之异步编程(三)
  8. 第一阶段:前端开发_Mysql——表与表之间的关系
  9. 解决Jenkins打不开浏览器问题
  10. python自动计算多个教学班的优秀率_第二个月课堂009python之总结(002)
  11. 在mysql命令行下执行sql文件
  12. python中函数包括标准库函数吗_Python标准库:内置函数divmod(a, b)
  13. 将Linux代码移植到Windows的简单方法
  14. 自己动手写cpu光盘资源
  15. 刷新bios后电脑死机了怎么办
  16. Java线程池与Lambda表达式
  17. 钱包:BUMO 小布口袋 APP 用户手册
  18. Arduinojson官网反序列化示例教程
  19. 微信小程序-入门到入土-01
  20. HTML5期末大作业:关于餐饮美食网站设计——香港美食介绍(8页) HTML+CSS+JavaScript 大学生毕设网页设计源码HTML 实训大作业HTML

热门文章

  1. 80c51单片机编程语言是什么,80C51单片机的指令系统(一)程序设计语言和指令...
  2. 浅谈Python爬虫(八)【有道词典翻译API】
  3. Canonical Coin Systems
  4. 邮箱 签名 / 电子名片 设置
  5. 谷歌浏览器无法使用翻译功能的解决方案,谷歌浏览器无法翻译怎么办?谷歌浏览器右键翻译失效了?
  6. 重设 Cisco 路由器ASA5505
  7. 路由器交换机之重设密码
  8. 重庆理工大学控制工程matlab大作业,(论文答辩)第六届校园数学建模知识竞赛决赛答辩会成功举行...
  9. 单片机__LED点阵学习收获
  10. 每天一个命令:ps命令