
例:发送的数据位是01111 0000 ,使校验位置1,让1 有5个(奇数)。
发送到接受方,接受方检查数据位正确性,发现1有4个(偶数),再看校验位是1,4+1=5(奇数)。判断数据正确
设置为偶校验,先看发送方将要发送的一帧数据中有几个1,如果是奇数个1则校验位置1,如果是偶数就置0。保证1的个数是偶数。保证是偶数后发送给接收方,接受方此时要检查发送的数据位是否有误,它检查的方法就是看接受的数据里1的个数,如果发现1的个数是奇数,再看看发送来的校验位是1且模式是偶校验,奇数+1=偶数,判断数据是正确。
例:发送的数据位是01111 1000 ,使校验位置1,让1 有6个(偶数)。
发送到接受方,接受方检查数据位正确性,发现1有5个(奇数),再看校验位是1,5+1=6(偶数)。判断数据正确
设置为1校验,校验位始终为1,接收方接收到数据发现检验位为1就判断数据正确,这种方法简陋。
设置为0校验,校验位始终为0,接收方接收到数据发现检验位为0就判断数据正确,这种方法简陋。
小结:通常用奇偶校验,本质就是判断数据位中1个数+校验位 = 奇数/偶数的方法。
也存在弊端比如用奇校验发送的是0111 0001 ,校验位是1。但到接收方变成1110 0001 ,接受也判断正确,但数据并不相同。
1、51单片机SCON=0xDA,工作在方式3.(方式2也可以)串口 1 模式 3:
波特率是可变的,其它和模式2 相同
11 位数据通过TxD/P3.1 发送,通过RxD/P3.0 接收。一帧数据包含一个起始位(0),8 个数据位(低位在
先),一个可编程的第9 位,和一个停止位(1)。发送时,第9 位数据位来自特殊功能寄存器SCON 的
TB8 位.接收时,第9 位进入特殊功能寄存器SCON 的RB8 位。
SMOD
串口1波特率在模式3 = ( 2 / 32 ) x BRT独立波特率发生器的溢出率
当SMOD = 0时,串口1波特率 = BRT 独立波特率发生器的溢出率 / 32,
当SMOD = 1时,串口1波特率 = BRT 独立波特率发生器的溢出率 / 16,
BRT独立波特率发生器的溢出率 = Fosc/12/( 256 - BRT ),当BRTx12 = 0时,
BRT独立波特率发生器的溢出率 = Fosc / ( 256 - BRT ),当BRTx12 = 1时
TB8:发送时校验位,可以奇校验或偶校验(直接置0或1),然后再发送。
RB8:接收时校验位,判断接数据是否正确。
2、程序
/*****************************************
*串口1中断
*****************************************/
void RXD_Int_Service() interrupt 4
{
uint8 ch
if(RI)
{
RI=0
Usart1.RxdDly=6 //超过0.3S清空计数
Usart1.RxdBuf[Usart1.RxdCnt]=ch
Usart1.RxdCnt++
if(Usart1.RxdCnt>=10)
{
Usart1.RxdTrue=1 //接收正确。
Usart1.RxdNum=Usart1.RxdCnt
Usart1.RxdCnt=0
}
}
if(TI)//防止发送中断
{
TI=0
}
}
void Timer0_InSevice() interrupt 1
{
TH0=0xdc //定义50ms 正常值0xfe 0x0c ,修正值:0xfe 0x16
TL0=0x00 //11.0592MHz晶振
if(Usart1.RxdDly)
{
Usart1.RxdDly-- //0.3S没有接收到数据,清0计数。
if(Usart1.RxdDly==0)
{
Usart1.RxdCnt =0 //记数清0.
}
}
}
串口通信,速度较慢。传送一个字节的数据,需要花费很长的时间。
那么,接收方收到的数据,是否与发送方,发送的数据相同?
在这么长时间中,完全有可能受到干扰,导致数据错误。
为什么要使用奇偶检验?
在这种条件下,就需要在数据之后,发送一个“校验位”。
接收方接收数据之后,也生成一个校验位。
然后比较两个校验位,是否相同,由此即可判断本次传输是否正确。
怎么使用奇偶检验?
你只要设置一下,即可。
校验位的生成、检验,都由硬件完成,你就不必 *** 心了。
奇偶校验中,会有奇数个 1、偶数个 1 的区别。
这些,都不是你所需要考虑的。
校验位是 1 是 0,你都不用费心,硬件会自己处理的。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)