android串口通讯奇偶校验,串口通讯奇偶数校验及CRC校验如何使用详解
我们以前在学校使用串口基本都不用奇偶数校验都是采用硬件CRC(循环冗余校验码)校验的。但有时候为了数据传输的更加严谨和差错的处理会采用奇偶校验。这里简单说下软件上CRC校验是如何计算的。
所谓CRC是指将数据以二进制的多项式形式来说明,也就是将二进制数转换成多项式的形式,多项式和二进制有直接的对应关系。x的最高次幂数对应二进制的最高位,那么对应的多项式的各次幂为:有此幂次项对应为1,无此幂次项对应0,且x的最高幂次为R,那么转出成对应的二进制数有R+1位;
例如报文:11001对应的信息多项式为:c(x)=
x^4+x^3+1;又如对应的信息多项式为c(x)=x^5+x^3+x+1;那么对应的报文数据为:101011;
多项式包括生成多项式G(X)和信息多项式C(x)(也就是要发送报文的二进制数据生成的多项式);
多项式是是发送方和接收方的一个约定,也是一个二进制数,在整个数据传输过程,这个数不会变,双方以这个数为标准,对发送的数据做一个“模2除法”,以此来验证数据的收发是否正确。且CRC校验码的位数=R-1(即是最高次幂位数减1);那么怎么计算出一个报文的CRC校验码呢?
假设生成多项式为:g(x)=x^4+x^3+x+1;求出对应要送二进制数据10101的CRC校验码;
1 先把生成多项式g(x)=x^4+x^3+x+1转换成二进制数除数即:11011;
2
从上面知道,CRC校验码为R-1=3,所以要发送的CRC校验码为3位数,那么将报文10101左移动3位即10101
000;后面3位就是后面要替换对应的CRC校验码的数。
3用生成多项式的二进制数对要发送的报文(10101
000)做“模2除法”运算,得到3位数的余数,就是对应的CRC校验码,将得到的余数替换报文后三位000即可。
说完CRC校验,下面说一下串口的奇偶数校验,基于51单片机来讲。
所谓的奇偶数校验就是串口数据传输提供的一种对收发数据是否正确的一种校验方式。是指将对应的要发送的数据以二进制的形式,计算其数据里面“1”的个数,例如数据:101101里面“1”的个数为4个,则为偶数个;又如数据:10101里面的“1”的个数为3个,则为奇数个。如,采用偶校验,那么101101对应的偶数校验码为0,10101对应的偶数校验码为1;满足发送的数据二进制的“1”的个数机上偶数校验码等于偶数的条件即可。
在51单片机中,一般不使用奇偶校验时,我们发送的数据是8位,使用奇偶校验时,在发送完数据后,还要再发送一位校验位即一共9位数据。而1单片机提供了TB8和RB8两个寄存器。在平时不使用奇偶数校验时,这两个寄存器没什么作用,TB8就是发送方要发送的奇偶数校验码寄存器,而RB8就是接收方接收到的奇偶数校验码状态寄存器。每次在发送数据前,要先计算出该数据对应的奇偶数校验码,并将该校验码赋值给TB8寄存器。接收将数据发送给发送寄存器buf,发送完数据,接着再发送一位校验码数据;而接收方通过RB8状态寄存器内的状态码来判断所接收数据是否符合奇偶数,从而判断数据传输有没有出错。
那么,如何计算得出奇偶校验码呢?下面写出两种楼主用的方法:
1:
u8 xdata parity=0; //初始判断标记
u8 xdata
parity_data=0;//对应是否为奇偶数
parity_data=c;// c为要发送的数据
while (parity_data)
{
parity = !parity; //奇数为1,偶数为0
parity_data = parity_data & (parity_data
- 1);
}
if(0==parity) //偶数
{
TB8=0;
}else // 奇数
{
TB8=1;
}
这里是通过parity定义初始变量为0 ,然后parity_data -
1来减少“1”的个数,再与上parity_data;每次减少一个“1”,对应parity就取反,直到最后一个“1”时,可得出对应的parity变量为“1”还是“0”,即可得出该数据是偶数还是奇数g
个“1”;然后再对TB8寄存器进行赋值;
2
ACC=c; // ACC累加器
if(P==1)// 奇数
{
TB8=1;
}
else
{
TB8=0;
}
第二种方法更加简单,直接利用ACC累加器来计算数据的奇偶校验码;
将数据直接赋值给ACC累加器,他会对数据进行一个累加。然后累加器中“P”位的数据会随ACC累加器中数值的变化而变化,如果ACC的数据有奇数个“1”则对应的"P"位置1,否则置0.那么就可以通过"P"来判断数据里面“1”的个数,从而对奇偶校验码寄存器赋值。
android串口通讯奇偶校验,串口通讯奇偶数校验及CRC校验如何使用详解相关推荐
- 串口、COM口、UART口, TTL、RS-232、RS-485区别详解
目录 一.什么是串口.COM口.UART口, TTL.RS-232.RS-485 摘要: 1.串口.COM口解释: 2.实物照片及解释 二.TTL.RS-232.RS-485的电平形式 1.TTL介绍 ...
- 常见的数据校验方式(奇偶,累加,CRC校验)
校验就是在通讯数据的后面附加一些信息,通过这些附加的信息来判断接收到的数据是否和发送出去的数据相同,数据是否准确无误的发送到接收端.常见的校验方式有奇偶校验,累加校验,CRC校验(多项式校验). 奇偶 ...
- Android自动化测试环境部署及adb sdkmanager avdmanager Monitor DDMS工具使用及命令详解
环境部署及工具使用 系列文章 前言 环境部署 硬件环境 软件环境 ADB工具 adb组成 adb命令 android命令 sdkmanager 命令 avdmanager命令 管理模拟器 monito ...
- android-短信验证功能,Android实现获取短信验证码的功能以及自定义GUI短信验证详解...
<Android实现获取短信验证码的功能以及自定义GUI短信验证详解>由会员分享,可在线阅读,更多相关<Android实现获取短信验证码的功能以及自定义GUI短信验证详解(8页珍藏版 ...
- Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解
Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解 目录 Android AR开发实践之七:OpenGLES相机预览背景绘制源码详解 一.OpenGL ES渲染管线 1.基本处 ...
- Android补间动画之ScaleAnimation、AlphaAnimation、RotateAnimation、TranslateAnimation、AnimationSet详解
首发:http://blog.csdn.net/harvic880925/article/details/40117115 一.概述 前两篇,我为大家讲述了利用XML来定义动画及插值器,但在代码中,我 ...
- 【Android UI设计与开发】8.顶部标题栏(一)ActionBar 奥义·详解
一.ActionBar介绍 在Android 3.0中除了我们重点讲解的Fragment外,Action Bar也是一个非常重要的交互元素,Action Bar取代了传统的tittle bar和men ...
- android 图片横竖判断_Android横竖屏切换及其对应布局加载问题详解
本文为大家分享了Android横竖屏切换及其对应布局加载问题,供大家参考,具体内容如下 第一,横竖屏切换连带横竖屏布局问题: 如果要让软件在横竖屏之间切换,由于横竖屏的高宽会发生转换,有可能会要求不同 ...
- android ble蓝牙接收不到数据_Android蓝牙4.0 Ble读写数据详解 -2
Android蓝牙4.0 Ble读写数据详解 -2 上一篇说了如何扫描与链接蓝牙 这篇文章讲讲与蓝牙的数据传输,与一些踩到的坑. 先介绍一款调试工具,专门调试Ble蓝牙的app.名字叫:nRF-Con ...
最新文章
- 电脑蓝屏问题检查、解决、
- 这是一份不完整的数据竞赛年鉴!
- 学计算机专业的毕业证,对于计算机专业的同学来说,学历真的那么重要吗?
- hdu2433 spfa+mark[x][u][v]优化
- 苹果自动关机_零下二十度,登山表爆表,苹果冻关机,电霸手机好
- 数据库原理与应用(SQL Server)笔记 第二章 简单数据查询
- rxjava 背压_背压加载文件– RxJava常见问题解答
- java第二章复习_JAVA第二章知识点
- 华为机试——求int型正整数在内存中存储时1的个数
- Python玩转各种多媒体,视频、音频到图片
- Kaggle新赛 | 医学影像插管分类,总奖池 5 万美金
- tomcat配置虚拟目录的方法
- elasticsearch 学习须知
- 如何使用 Buildah 构建容器镜像
- SSL 重点SSL会话步骤
- JavaScript封装自己的库
- matplotlib之pyplot模块——填充两条曲线之间区域(fill_between、fill_betweenx)
- 联想全系列官方WIN10工具
- 如何提升程序员的非技术才能
- 视壮提前祝大家国庆快乐!