表面厂家
免费服务热线

Free service

hotline

010-00000000
表面厂家
热门搜索:
技术资讯
当前位置:首页 > 技术资讯

单片机C51串口中断接收和发送测试例程含通信协议的实现

发布时间:2020-07-21 19:23:19 阅读: 来源:表面厂家

通信协议:第1字节,MSB为1,为第1字节标志,第2字节,MSB为0,为非第一字节标志,其余类推……,最后一个字节为前几个字节后7位的异或校验和。 测试方法:可以将串口调试助手的发送框写上95102025,并选上16进制发送,接收框选上16进制显示,如果每发送一次就接收到95102025,说明测试成功。 //这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收 //和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的 #include #include #defineINBUF_LEN4//数据长度 unsignedcharinbuf1[INBUF_LEN]; unsignedcharchecksum,count3; bitread_flag=0; voidinit_serialcomm(void) { SCON=0x50;//SCON:serailmode1,8-bitUART,enableucvr TMOD|=0x20;//TMOD:timer1,mode2,8-bitreload PCON|=0x80;//SMOD=1; TH1=0xF4;//Baud:4800fosc=11.0592MHz IE|=0x90;//EnableSerialInterrupt TR1=1;//timer1run //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(kstrlen); } //串口接收中断函数 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); } } }

上海热玛吉价格

北京磨骨价格

合肥磨骨