串口 奇偶校验代码

//奇校验就是在最后一位设置校验位,通过调整最后一位来满足整个发送数据中1的数据为奇数的原则。偶校验同理。 此外还有较完善的CRC校验
/*
奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如:
      1 0110,0101   
        0 0110,0001 
*/

unsigned long  a,c,temp; //a=0x0001;
unsigned int b,jynum;	 //1 number
void jy()
{
   int i;
   temp=0x000F;
   a=0x0001;
   jynum=0;
   for(i=0;i<16;i++)
   {
   	  if(temp&a) 
	 {
	   jynum++;
	  }
	   temp>>=1; 
   }
   if(jynum%2==0) temp+=0x30000;
   else temp|=0x20000;
   printf("%0x\n",temp);
}
void main()
{
 while(1)
 {
  jy();
  }
}

### 串口通信中奇偶校验的实现 #### 背景介绍 串口通信是一种常见的数据传输方式,在实际应用中为了提高可靠性,通常会引入校验机制。其中,奇偶校验是最常用的方法之一。MCS-51系列单片机支持多种串行口工作模式,但在特定情况下需要通过软件来完成奇偶校验功能[^1]。 --- #### 奇偶校验的基本原理 奇偶校验的核心在于统计待发送数据中“1”的个数,并据此决定附加的校验位值。具体来说: - **偶校验**:如果数据中“1”的个数为偶数,则校验位设为0;否则设为1。 - **奇校验**:如果数据中“1”的个数为奇数,则校验位设为0;否则设为1[^3]。 这种简单的逻辑可以通过硬件电路或者软件算法轻松实现。 --- #### C语言实现奇偶校验 以下是基于C51单片机的一个典型例子,展示如何在串行通信中实现奇偶校验: ```c #include <reg51.h> // 计算奇偶校验位函数 unsigned char parity(unsigned char data) { unsigned char count = 0; while (data) { // 统计二进制表示中'1'的数量 count += data & 1; data >>= 1; // 右移操作 } return count % 2 ? 1 : 0; // 如果‘1’数量为奇数返回1,否则返回0 } void send_data_with_parity(unsigned char data) { unsigned char p_bit = parity(data); // 获取校验位 SBUF = data; // 发送原始数据 while(TI == 0); // 等待发送完成标志置位 TI = 0; SBUF = p_bit; // 发送校验位 while(TI == 0); TI = 0; } ``` 此代码片段展示了如何利用循环右移的方式计算数据中的“1”个数并生成相应的校验位[^1]。 --- #### FPGA上的奇偶校验实现 对于更复杂的场景(如FPGA),可以借助组合逻辑快速完成校验位的计算。以下是一个简化版的设计思路描述: 1. 接收到完整的8位数据后,立即启动异或运算链路 `data[0]^data[1]^...^data[7]` 来得出初步结果; 2. 将该结果与预定义的目标状态比较(即期望的奇/偶性质); 3. 若匹配成功,则允许继续执行后续动作(比如触发TX信号)。否则丢弃当前帧或将错误标记记录下来供调试分析之用[^4]。 --- #### 存在的问题及解决方案 尽管奇偶校验易于部署且开销较低,但它也存在一些固有的局限性: - 它仅能检测单一比特翻转的情况而无法处理多位同时改变的情形[^2]。 - 需额外占用一条线路作为专门用途从而降低了整体吞吐量。 针对这些问题可能采取改进措施包括但不限于改用更强效但复杂度更高的CRC方法代替传统单纯依靠Parity Bit来做验证的工作流程等等... ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值