欢迎来到天天文库
浏览记录
ID:37929133
大小:38.50 KB
页数:7页
时间:2019-06-03
《485通讯从机接收程序(带帧校验)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、///////////////////////////////////////////////////////////////////////////////////从机程序//01数据帧//02命令帧//03功能帧01确认02否认#include#include#include#include#include#include#definemyaddr0x01 /
2、/定义本机地址#definerx_485();asm("cbi0x13,2");//portd.2清零改为接收状态#definetx_485();asm("sbi0x13,2");//portd.2置位改为发送状态volatilestructconn{unsignedcharbuf[70];unsignedchardata[64];unsignedcharsrcadd;//源地址unsignedcharaimadd;//目的地址unsignedchartp;//帧类型intnum;inttmp;unsignedcharv
3、er;//验证码;unsignedcharerr;//错误码; 01:帧校验错}tx,rx;volatileunsignedcharcom;//命令constunsignedcharflash_str[]PROGMEM="0123456789";ISR(USART_RXC_vect){ rx.buf[rx.tmp]=UDR; /*test if(rx.tmp==0&&rx.buf[rx.tmp]=='t') { totx(); tx.num=16; strcpy(tx.buf,"canih
4、elpyou"); tx.buf[15]=0x0D; UCSRB
5、=(1<4)&&(rx.tmp==rx.buf[3
6、]+4)&&(rx.buf[rx.tmp]!=rx.ver))//验证错误 { //当接收结束后,什么事情都不干,就等待接收。 rx.err=0x01; }; if((rx.tmp>4)&&(rx.tmp==rx.buf[3]+5)&&(rx.buf[rx.tmp]==0xcc)&&rx.err==0)//正常结束 { //帧类型分情况 //否认帧还是确认帧还是其它帧 TCCR2=0x00; //PORTA+=1; if(rx.buf[2]!=3) {
7、 //发送确认帧 tx.aimadd=rx.buf[1]; tx.srcadd=myaddr; tx.tp=0x03; tx.num=1; tx.data[0]=01; tx_init(); asm("sei"); tx_send(); com=23; //处理接收到的数据 //延时一段时间,发送新数据 } else { if(rx.buf[3]==0x02)//收到否认帧
8、 { tx_resend(); } } return; } rx.ver^=rx.buf[rx.tmp]; rx.tmp++; timer2_init();//测试什么时候传送结束};ISR(TIMER2_COMP_vect){//发生此中断说明通讯没有正常结束UCSRB&=~(1<9、.tp=0x03; tx.num=1; tx.data[0]=02;//否认帧 tx_init(); tx_send(); }//延一下时//发送确认帧还是否认帧,如果是确认帧则中止计时器1,如果是否认帧则要求进行重发,并且};ISR(USART_UDRE_vect){UDR=tx.buf[tx.tmp];
9、.tp=0x03; tx.num=1; tx.data[0]=02;//否认帧 tx_init(); tx_send(); }//延一下时//发送确认帧还是否认帧,如果是确认帧则中止计时器1,如果是否认帧则要求进行重发,并且};ISR(USART_UDRE_vect){UDR=tx.buf[tx.tmp];
此文档下载收益归作者所有