485通讯从机接收程序(带帧校验).doc_第1页
485通讯从机接收程序(带帧校验).doc_第2页
485通讯从机接收程序(带帧校验).doc_第3页
485通讯从机接收程序(带帧校验).doc_第4页
485通讯从机接收程序(带帧校验).doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/从机程序/01数据帧/02命令帧/03功能帧 01 确认 02 否认#include#include#include#include#include #include#define myaddr 0x01 /定义本机地址#define rx_485(); asm(cbi 0x13,2); /portd.2清零 改为接收状态#define tx_485(); asm(sbi 0x13,2); /portd.2置位 改为发送状态volatile struct connunsigned char buf70;unsigned char data64;unsigned char srcadd;/源地址unsigned char aimadd;/目的地址unsigned char tp;/帧类型int num;int tmp;unsigned char ver; /验证码; unsigned char err; /错误码; 01:帧校验错tx,rx;volatile unsigned char com; /命令const unsigned char flash_str PROGMEM = 0123456789;ISR(USART_RXC_vect) rx.bufrx.tmp=UDR; /*test if(rx.tmp=0 & rx.bufrx.tmp=t) totx(); tx.num=16; strcpy(tx.buf,can i help you); tx.buf15=0x0D; UCSRB|=(1UDRIE);/发送帧 ; */ if(rx.tmp=0 & rx.bufrx.tmp!=myaddr) /地址不对直接返回 /禁止接收0.15秒。可行,因为使用中断模式,不影响正常使用 UCSRB&=(14) & (rx.tmp=rx.buf3+4) & (rx.bufrx.tmp!=rx.ver)/验证错误 /当接收结束后,什么事情都不干,就等待接收。 rx.err=0x01; ; if(rx.tmp4) & (rx.tmp=rx.buf3+5) & (rx.bufrx.tmp=0xcc) & rx.err=0)/正常结束 /帧类型分情况 /否认帧还是确认帧还是其它帧 TCCR2 = 0x00; /PORTA+=1; if(rx.buf2!=3) /发送确认帧 tx.aimadd=rx.buf1; tx.srcadd=myaddr; tx.tp=0x03; tx.num=1; tx.data0=01; tx_init(); asm(sei); tx_send(); com=23; /处理接收到的数据 /延时一段时间,发送新数据 else if(rx.buf3=0x02) /收到否认帧 tx_resend(); return; rx.ver=rx.bufrx.tmp; rx.tmp+; timer2_init();/测试什么时候传送结束;ISR(TIMER2_COMP_vect)/发生此中断说明通讯没有正常结束UCSRB&=(1RXEN);if(rx.err=0x01 & rx.buf2!=0x03) /发否认帧 tx.aimadd=rx.buf1; tx.srcadd=myaddr; tx.tp=0x03; tx.num=1; tx.data0=02;/否认帧 tx_init(); tx_send(); /延一下时/发送确认帧还是否认帧,如果是确认帧则中止计时器1,如果是否认帧则要求进行重发,并且;ISR(USART_UDRE_vect)UDR=tx.buftx.tmp;tx.tmp+;if(tx.tmp=tx.num+6)UCSRB&=(1UDRIE);/停止望UDR中注入数据。;ISR(USART_TXC_vect)torx(); /进入接收状态;ISR(TIMER1_COMPA_vect)torx();/进入接收状态;void torx(void)/如果是数据帧或者命令帧则进行计时等待UCSRB=0x90;rx_485(); / 改为接收状态rx.tmp=0; /游标清零rx.ver=0;rx.err=0;void totx(void)UCSRB=0x48; /udre 不置位,等待 初始化后,进行tx_485();tx.tmp=0; /游标清零tx.ver=0;tx.err=0;/比较前多少位 str1 源 目标 n 字符个数uint8_t strcomp(char *str1,char str2,uint8_t n) char i,*p,*q; p=str1; q=str2; for(i=0;in;i+) if(*p!=*q) return 0; ; ; return 1;void timer1_init(void) /0.15秒计时TCCR1B = 0x00; /stopTCNT1H = 0xF7; /setupTCNT1L = 0x92;OCR1AH = 0x08;OCR1AL = 0x6E;TCCR1A = 0x00;TCCR1B = 0x0C; /start Timervoid timer2_init(void)TCCR2 = 0x00; /stopASSR = 0x00; /set async modeTCNT2 = 0xC2; /setupOCR2 = 0x3E;TCCR2 = 0x0E; /startvoid uart_init(uint8_t ubbrh,uint8_t ubbrl)UCSRB = 0x00; /disable while setting baud rateUCSRA = 0x00;UCSRC =_BV(URSEL)| 0x06;UBRRL = ubbrl; /set baud rate lo/UBRRH = ubbrh; /set baud rate hi/tx结构初始化函数,不浪费内存了,没有参数,在初始化前赋值void tx_init()totx();/发送准备状态tx.buf0=tx.aimadd;tx.ver=tx.aimadd;tx.buf1=tx.srcadd;tx.ver=tx.srcadd;tx.buf2=tx.tp;tx.ver=tx.tp;tx.buf3=tx.num;tx.ver=tx.num; for(int i=0;itx.num;i+)tx.bufi+4=tx.datai;tx.ver=tx.datai;tx.buftx.num+4=tx.ver;tx.buftx.num+5=0xcc; /tbuf组帧成功/没有必要进行时钟延时检验,因为从机将一直处于接收状态timer1_init();/UCSRB|=(1UDRIE);/发送函数;addr,地址;tp=0 发送命令帧 tp=1 发送数据帧,p=要发送的内容,bnum 发送的字节数/在使用此函数前首先要确保buf有内容 发射后不管void tx_send(void)tx_init();/发送帧,利用中断/timer1_init();/no needUCSRB|=(1UDRIE);/发送帧;void tx_resend()totx();/发送准备状态UCSRB|=(1UDRIE);/发送帧 int main(void) DDRA=0XFF; PORTA=0x00; DDRC=0x00; PORTC=0x00; DDRB=0xff; PORTB=0x0f; DDRD=0x04; PORTD=0x00;/接收态 TIMSK = 0x90; /开t1a 和 t2 比较中断 uart_init(0x00,0x17);/初始化uart asm(sei); /接收开始 torx(); /*发送测试 totx(); tx.aimadd=0xff; tx.srcadd=myaddr; tx.tp=0x02; tx.num=3; strcpy(char *)tx.data,123); tx_init(); tx_send(); /采用轮转结构,利用t0 每个 /通信 /显示 AD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论