1.                     奇偶校验

奇偶校验是检错中比较常见的一种方法。它利用数据中的1的个数作为检错的标志位,若1的个数为奇数个,则错误检测的标志位为1,若1的个数为偶数,则错误检测的标志位为0。在发送端和接收端同时检测奇偶位,若得到相同的结果,则说明数据传输过程无错误发生;若得到不同的结果,则说明数据传输过程中有错误发生,此时下位机可以发送一个错误重传的信号,让上位机再次发送数据。目前网上很多的串口收发工具,不具有奇偶校验功能,所以大多数使用。

2.异或校验又称异或和校验或者BCC校验

BCC check是比较常用的串口数据校验。检验和的概念一般体现在8bit长度的字符数组 ,

注意 :异或校验是异或运算,需要先强制把字符转换成整形数据。

NIOS串口程序异或校验

static void uart_ISR(void)

{

alt_u8 data_temp;

alt_u8 add_temp;

while( !(UART->STATUS.BITS.RRDY));

data_temp = UART->RXDATA.BITS.RECEIVE_DATA;

//     uart_send_byte(UART->RXDATA.BITS.RECEIVE_DATA);

if( data_temp == 0x7e &&my_uart.receive_count == 0 )

{

my_uart.receive_buffer[0] =0x7e;

my_uart.receive_count = 1;

}

else if( my_uart.receive_count == 1 )

{

if( data_temp == 0xff)

{

my_uart.receive_buffer[1]= 0xff;

my_uart.receive_count= 2;

}

else

my_uart.receive_count= 0;

}

else if( my_uart.receive_count > 1 && my_uart.receive_count< 8 )

{

my_uart.receive_buffer[my_uart.receive_count++]= data_temp;

if(my_uart.receive_count== 8)

{

add_temp = my_uart.receive_buffer[1]^my_uart.receive_buffer[2]^my_uart.receive_buffer[3]^my_uart.receive_buffer[4]^my_uart.receive_buffer[5];

//                   uart_send_string(5,my_uart.receive_buffer );

if( my_uart.receive_buffer[6]== add_temp && my_uart.receive_buffer[7] == 0xe7 )

{

my_uart.receive_flag= 1;

}

my_uart.receive_count= 0;

}

}

UART->STATUS.WORD=0;

}

3.和校验又称累加和校验

a.RFC1071源码

unsigned short csum(unsigned char *addr, int count){

register long sum = 0;

while( count &gt; 1 ){

sum += * (unsigned short) addr++;

count -= 2;

}

if( count &gt; 0 )

sum += * (unsigned char *) addr;

while (sum&gt;&gt;16)

sum = (sum &amp; 0xffff) + (sum &gt;&gt; 16);

return ~sum;

}

第一个while循环是做普通加法(2进制补码加法),因为IP包头和TCP整个报文段比较短(没达到2^17数量级),所以不可能导致4字节的sum溢出(unsigned long 一般至少为4字节)).

紧接着的一个判断语句是为了能处理输入数据是奇数个字节的这种情况.再接着的数据循环是实现反码算法(在前面的普通加法得到的数据的基础上),由反码和的高位溢出加到低位的性质,可得到&quot;32位的数据的高位比特移位16

比特,再加上原来的低16比特,不影响最终结果&quot; 这个等价运算,因为sum的最初值(刚开始循环时)可能很大,所以这个等价运算需循环进行,直到sum的高比特(16比特以上)全为0.对于32 位的 sum,

事实上这个运算循环至多只有两轮,所以也有程序直接用两条&quot;sum = (sum &amp; 0xffff) + (sum &gt;&gt; 16);&quot;代

替了整个循环.最后,对和取反返回.

b.对数据长度没限制的实现

unsigned short cksum (struct ip *ip, int len){

long sum = 0;

while ( len &gt;1 ){

sum += *((unsigned short *) ip)++;

if (sum &amp; 8x00000000)

sum = (sum &amp; 0xFFFF) + (sum&gt;&gt; 16)

len -= 2;

}

if ( len )

sum += ( unsigned short ) * (unsignedl char *) ip;

while ( sum &gt;&gt; 16)

sum =(sum &amp; 0xFFFF) + (sum&gt;&gt; 16);

return ~sum;

}

这个实现与前面的一个的最大的不同是对数据的长度没什么限制了,因为它在第一个循环的加法运算中实时检测sum的高位的值,一旦发现其有溢出的危险,就及时运用等价运算关系消除了这个危险.

奇偶校验,异或校验,和校验,nios串口校验相关推荐

  1. UART串口校验方式(无校验、奇偶校验、固定校验)

    UART串口校验方式(奇偶校验.固定校验.无校验) 串口通信校验方式 奇偶校验位 固定校验位(Stick) 无校验位 校验位:串口通信中的检错方式.串口在接收数据时,如果无检验位,则只要检测到串口出现 ...

  2. 计算机组成原理——奇偶校验,海明校验,循环冗余校验

    1.奇偶校验码 奇偶校验就是在原有的二进制数据的基础上加上以为的校验位 奇校验:整个校验码(原有信息+校验位)中的"1"的个数为奇数 偶校验:整个校验码(原有信息+校验位)中的&q ...

  3. 计算机三种校验方式,三种校验码

    奇偶校验.海明码.CRC循环冗余校验码 三种校验码比较重要,需要牢记,在计算机网络中用处较大 奇偶校验 根据被传输的一组二进制代码的数位中"1"的个数是奇数或偶数来进行校验.采用奇 ...

  4. 一文详解循环冗余校验校验算法(CRC校验)及C语言代码的实现 ---- 以CRC-16/MODBUS为例讲解

    一.概述 现在的产品开发过程中,无论是数据的储存还是传输,都需要确保数据的准确性,所以就需要在数据帧后面附加一串校验码,方便接收方使用校验码校验接收到的数据是否是正确的. 常用的校验方式有奇偶校验.异 ...

  5. 纵向冗余校验计算方法_常见校验算法

    常见校验算法 一.校验算法 奇偶校验 MD5 校验 求校验和 BCC(Block Check Character/ 信息组校验码 ) ,好像也是常说的异或校验方法 CRC(Cyclic Redunda ...

  6. 【计算机网络】数据链路层 : 差错控制 ( 纠错编码 | 海明码 | “海明码“ 原理 | “海明码“ 工作流程 | 确定校验啊位数 | 确定校验码和数据位置 | 求校验码值 | 检错纠错 )★

    文章目录 一. "海明码" 工作原理 二. "海明码" 工作流程 三. 确定校验码位数 四. 确定校验码和数据位置 0. 确定校验码位置 1. 引入二进制位 2 ...

  7. 进制转换及如何求校验码(海明校验码及循环冗余校验CRC码)

    文章目录 前言 一.进制转换 1.1 二进制转换为八进制数和十六进制数 1.2 任意进制数转换为十进制数 1.3 十进制转换为任意进制 二.校验码求取 2.1海明校验码 2.2循环冗余校验CRC码 总 ...

  8. 常用校验码(奇偶校验码、海明校验码、CRC校验码)

    常用校验码(奇偶校验码.海明校验码.CRC校验码) 一.奇偶校验码 二.海明校验码 三.CRC校验码   计算机系统运行时,各个部之间要进行数据交换.交换的过程中,会有发生误码的可能(即0变成1或1变 ...

  9. element-ui的表单校验;el-form表单校验;el-form表单自定义校验;手机号校验;车牌号校验;车牌号正则校验;

    示例:代码在末尾 可以直接复制使用 一.基本属性认知: 1. required: true 会有 * , 但仅是触发最后点击提交按钮时,校验某一项位必填:与输入事件或者选择或者失焦时候 怎么校验无关 ...

最新文章

  1. access下如何配置两个vlan_【新华三】网络工程师 H3C如何配置VLAN-trunk 二层隔离技术...
  2. 2018年智能化发展趋势:语音交互全球开战、AI终端趋势显现
  3. 使用ycsb对mongodb做性能测试
  4. java一段时间后执行一块代码_java自带的ScheduledExecutorService定时任务正常执行一段时间后部分任务不执行...
  5. thinkphp 前端页面js接收后端传过来的数据
  6. request用法_虚拟语气用法总结
  7. yum命令 启用仓库_yum仓库详细解读
  8. JavaScript中的点击事件
  9. Hibernate框架使用教程
  10. 【精讲版】上位机C#/.NET与西门子PLC通信
  11. cuda环境安装--windows离线安装
  12. 开源资产管理软件OCS Inventory 实践
  13. tensorflow-鸢尾花分类(神经网络)
  14. AVA时空检测数据集下载—AVA_ActionsAVA_Kinetics
  15. [正则表达式]VBA
  16. 【特征工程】机器学习中离散型特征的处理 —— 独热码 (one-hot)
  17. vmware 16 安装 macOS15
  18. 马虎的算式(蓝桥杯c语言)
  19. oracle中110个常用函数
  20. 【爬虫】六、综合案例之爬网易云音乐评论信息

热门文章

  1. 今天14:00 | 12位一作华人学者开启 ICLR 2022
  2. mysql之DDL操作
  3. 最浅显易懂的数据库索引讲解
  4. 迅雷链流量扶持放大招:手雷链克专区上线!
  5. 华势喔刷MPOS日结政策 诚招合作代理加盟商
  6. 八年 Java 老鸟,写给 1-3 年程序员的几点建议,满满硬货指导
  7. 实战:读懂这一篇掌握电商后台设计
  8. 共享文件夹Windows和Linux双向粘贴
  9. VTK- vtkStripper
  10. 22.3TB全国1-20级谷歌离线卫星影像终于出炉了