//这是一个单片机C51串口接纳(中止)和发送例程,能够用来测验51单片机的中止接纳
//和查询发送,别的我觉得发送没有必要用中止,因为程序的开支是相同的
#include
#include
#defineINBUF_LEN4//数据长度
unsignedcharinbuf1[INBUF_LEN];
unsignedcharchecksum,count3;
bit read_flag=0;
voidinit_serialcomm(void)
{
SCON =0x50;//SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |=0x20;//TMOD: timer 1, mode 2, 8-bit reload
PCON |=0x80;//SMOD=1;
TH1 =0xF4;//Baud:4800 fosc=11.0592MHz
IE |=0x90;//Enable Serial Interrupt
TR1 =1;// timer 1 run
// TI=1;
}
//向串口发送一个字符
voidsend_char_com(unsignedcharch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
//向串口发送一个字符串,strlen为该字符串长度
voidsend_string_com(unsignedchar*str,unsignedintstrlen)
{
unsignedintk=0;
do
{
send_char_com(*(str + k));
k++;
}while(k < strlen);
}
//串口接纳中止函数
voidserial () interrupt4using3
{
if(RI)
{
unsignedcharch;
RI =0;
ch=SBUF;
if(ch>127)
{
count3=0;
inbuf1[count3]=ch;
checksum= ch-128;
}
else
{
count3++;
inbuf1[count3]=ch;
checksum ^= ch;
if( (count3==(INBUF_LEN-1)) && (!checksum) )
{
read_flag=1;//假如串口接纳的数据到达INBUF_LEN个,且校验没错,
//就置位取数标志
}
}
}
}
main()
{
init_serialcomm();//初始化串口
while(1)
{
if(read_flag)//假如取数标志已置位,就将读到的数从串口宣布
{
read_flag=0;//取数标志清0
send_string_com(inbuf1,INBUF_LEN);
}
}
}
//——————————————————————-
//crc:校验子程序
//开端地址指针ADRS,需校验字节数量SUM
//校验成果:高位CRCH,低位CRCL
//——————————————————————-
void CCRC(unsigned char *ADRS,unsigned char SUM)
{
unsigned int data CRC; //校验码
unsigned char data i;
unsigned char data j;
CRC=0xFFFF;
for (i=0;i
{
CRC^=*ADRS;
for (j=0;j<8;j++)
{
if ((CRC & 1)==1)
{
CRC>>=1;
CRC^=0xA001;
}
else
{
CRC>>=1;
}
}
ADRS++;
}
CRCH=CRC&0xFF;
CRCL=CRC>>8;
}
//——————————————————————-
//其他程序调用比如
//校验数组前6位
//——————————————————————-
//。。。
unsigned char data RBuf[9]; //数据区
CCRC(&RBuf,6);
//。。。
CRC过失查验法在PC机与8031单片机串行通讯中的使用
2008-06-10 13:50:46 来历:现代电子技术作者:刘涛廉海…点击:401次
摘 要 经过对不同校验办法的剖析,介绍了一种合适PC机与8031单片 机通讯过失校验的CRC办法并给出了其完结的软件流程图。
关键词 数据传输过失校验CRC
跟着数据收集体系的功用日益强壮,以及微型核算机的遍及,在现代工业中,使用微机进行数据通讯的工业操控使用得也越来越广泛。特别是在大规模高精度数据收集体系中,对数据进行剖析和核算将占用很大一部分单片机的资源,能够将收集到的数据经过串行通讯办法传送给PC机,由PC机来完结数据的处理工作。可是因为传输间隔、现场状况等许多或许呈现的要素的影响,核算机与受控设备之间的通讯数据常会产生无法猜测的过错。为了避免过错所带来的影响,在数据的接纳端有必要进行过失校验。尽管过失校验也能够完全由硬件来承当,但因为单片机和PC都具有很强的软件编程才能,这就为施行软件的过失校验供给了前提条件,而软件的过失校验有经济实用并且不添加硬件开支的长处。本文便是依据多功用应变测验体系而编写的主机和单片机之间的RS-485通讯体系,介绍了一种软件过失校验计划循环冗余过失校验法。
1 CRC法的原理
传统的过失查验法有:奇偶校验法,校验和法,队伍冗余校验法等。这些办法都是在数据后边加必定数量的冗余位一同发送出去,例如在单片机的通讯办法2和3中,TB8就能够作为奇偶校验位同数据一同发送出去,在数据的接纳端经过对数据信息进行比较、判别或简略的求和运算,然后将所得和接纳到的冗余位进行比较,若持平就以为数据接纳正确,不然就以为数据传送进程中呈现过错。可是冗余位只能反映数据行或列的奇偶状况,所以这 类查验办法对数据行或列的偶数个过错不灵敏,漏判的概率很高。因而,此种办法的可靠性 就差。
循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。它是使用除法及余数 的原理来作过错侦测(Error Detecting)的。实践使用时,发送设备核算出CRC值并随数据一同发送给接纳设备,接纳设备对收到的数据从头核算CRC并与收到的CRC相比较,若两个CR C值不同,则阐明数据通讯呈现过错。因为这种办法获得校验码的办法具有很强的信息掩盖才能,所以它是一种功率极高的过错校验法。过错的概率简直为零。在许多的仪器设备中都 选用这种冗余校验的通讯规约。
依据使用环境与习气的不同,CRC又可分为以下几种规范:
① CRC-12码;② CRC-16码;
③ CRC-CCITT码;④ CRC-32码。
CRC-12码一般用来传送6-bit字符串。CRC-16及CRC-CCITT码则是用来传送8-b it字符,其间CRC-16为美国选用,而CRC-CCITT为欧洲国家所选用。CRC-32码大都被选用在一种称为Point-to-Point的同步传输中。
2 CRC校验码的生成进程
咱们以最常用的CRC-16码作为比如进行阐明。
冗余循环码包含2个字节,即16位二进制数。先预置16位寄存器悉数为1,再逐 步把每8位的数据信息进行处理。在进行CRC核算时只用8位数据位,开始位和中止位,如有 奇 偶校验位的话也包含奇偶校验位,都不参加CRC核算。
在核算CRC码时,8位数据与寄存器的数据相异或,得到的数据向低位移一位,用 0添补最高位,再查看最低位。假如最低位为1,把寄存器的内容与预置数相异或;若最低位 为0,则不进行异或核算。
这个进程一向重复8次,第8次移位后,下一个8位数据再与现在寄存器中的内容 相异或,这个进程和以上相同重复8次。当一切的信息处理完后,最终寄存器中的内容即为C RC码。这个CRC码将由发送设备跟在数据的最终一同发送。
核算CRC的进程为:
(1)预置16位寄存器位十六进制数FFFF(即全为1)。称此寄存器位CRC寄存器。
(2)把第一个8位数据与16位寄存器的低位相异或,将成果放于CRC寄存器中;
(3)把寄存器的内容右移一位(朝低位),用0添补最高位,查看最低位;
(4)假如最低位为0,重复第三步(再次移位);
假如最低位为1,CRC寄存器与多项式码进行异或;
(5)重复进程3和4,直到右移8次,这样整个8位数据悉数进行了处理;
(6)重复进程2到5,进行下一个8位数据的处理;
(7)最终得到的CRC寄存器即为CRC码。
3 CRC法在收发两边的软件完结
依据前面给出的CRC码的生成进程,咱们能够编制CRC校验程序,依据通讯协议通 过RS232-RS485电平转化接口和MAX485,PC机的串口与单片机的串行口进行串行异步通讯, 需求发送的数据信息位8位,选取异或多项式为A001(Hex)。
8031单片机CRC算法的程序流程图如图1所示。一同给出汇编言语的源程序。
CRC源代码:
CRCH,CRCL,CRCD别离代表CRC校验码的高8位,低8位和要处理的数据。
PC机的CRC程序思路与单片机完全相同,信息的处理、发送和接纳能够用任何一种高档规划 言语来完结。
本文首要评论了用CRC法进行过失校验的问题,接纳方假如发现接纳过错,则回来信息,要求主机重发数据;假如没有发现过错,则不反应信息。由此能够进步收发功率。实践证明CRC法在PC机与8031单片机异步通讯的过失查验中使用是非常有用的,能够在实践中得到广泛使用。
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/chuanganqi/277432.html