-—,只是人为规定一个为发送,一个为接收。要求两机串行口的波特率相同,因而发送和接收方串行口的初始化相同。可编制含有初始化函数、发送函数接收函数的程序,在主函数中根据程序的发送、接收设置TR,采用条件判别决定使用发送函数还是接收函数。这样点对点通信的双方都可运行此程序,只需在程序运行之前人为设置选择TR,一个令TR=0,一个令TR=1,然后分别编译,在两机上分别装入,同时运行。例1点对点通信。点对点通信的程序如下:#include<>#defineucharunsignedchar#R1 /*发送接收差别值TR=0发送*/ucharidatabuf[10];ucharpf;voidinit(void) /*串行口初始化*/{TMOD=0x20; /*设T/C1为定时方式2*/TH1=0xe8; /*设定波特率*/TL1=0xe8;PCON=0x00;TR1=1; /*启动T/C1*/SCON=0x50; /*串行口工作在方式1*/}voidsend(ucharidata*d){uchari;do{SBUF=0xaa; /*发送联络信号*/while(TI==0); /*等待发送出去*/TI=0;while(RI==0); /*等待B机回答*/RI=0;}while((SBUF^0xbb)!=0); /*B机未准备好,继续联络*/do{pf=0; /*清校验和*/for(i=0;i<16;i++){SBUF=d[i]; /*发送一个数据*/pf+=d[i]; /*求校验和*/while(TI==0);TI=0;}SBUF=pf; /*发送校验和*/while(TI==0);TI=0;while(RI==0);RI=0; /*等待B机回答*/}while(SBUF!=0); /*回答出错,则重发*/}voidreceive(ucharidata*d){uchari;do{while(RI==0);RI=0;} while((SBUF^0xaa)!=0); /*判A机请求否*/SBUF=0xbb; /*发应答信号*/while(TI==0);TI=0;while(1){pf=0; /*清校验和*/for(i=0;i<16;i++){while(RI==0);RI=0;d[i]=SBUF; /*接收一个数据*/pf+=d[i]; /*求校验和*/}while(RI==0);RI=0; /*接收A机校验和*/if((SBUF^pf)==0) /*比较校验和*/{SBUF=0x00;break;} /*校验和相同发"00"*/else{SBUF=0xff; /*出错发"FF",重新接收*/while(TI==0);TI=0;}}}voidmain(void){init();if(TR==0){send(buf);}else{receive(buf);}}
Uart串口收发程序专题课件 来自淘豆网www.taodocs.com转载请标明出处.