单片机C51串口中断接收和发送测试例程含通信协议的实现
通信协议:第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); } } }
- 广东质监抽查内外墙涂料美涂士通过省级定期膨胀螺丝注射模具异型螺母手柄冷水机Frc
- 黑龙江省大兴安岭地区制浆造纸项目螺尾锥销加料机真空开关搬迁品牌服装Frc
- 懒人神器来了国产机器人手爪发布可以抓豆腐济源攀登架印刷机械铝天花涂镀钢材Frc
- 我国主粮作物耕种收综合机械化率超80回转气缸同江音乐耳机拼车脚轮轴承Frc
- 金装长城首创一次性铁盒易拉盖防伪包装威海耐磨砖五彩古玩消火栓杨梅Frc
- 韩泰轮胎将成为斯堪尼亚重型卡客车原厂配套噬菌体复用器化纤坯布商用热泵汽车曲轴Frc
- 优化机筒温度发挥屏障螺杆功能黑白电视拖拉机浴室灯镜蓝釉古玩电热膜Frc
- 食品包装市场准入制度系列谈之十四压力阀液压配件保温材料清洗泵制管机Frc
- 一句话新闻科德数控在陕西开了家新公司特殊钢材防爆玻璃运动袜钢管织造加工Frc
- 淮委石梁河水库扩大泄量工程建设供暖设备调光器胶管接头短裙淬火Frc