以前从来没有遇到过这个怪事。 使用的上MEGA48V,PB0通过一个反相器控制485的收发。设置485为发,延时1毫秒,发数据,延时1毫秒,设置485为收,却发现总是少两个字节没发出去(监控端口收不到最后两个字节)。把发数据后的延时改为17毫秒及以上,才能完整地把数据发出去。 MEGA48V的通讯以前也用过,通讯也没有这个问题,这回不知道什么原因,难道是字节发送函数中,每个字节都要17毫秒/2的时间才能发出去,所以不延时17毫秒就会丢数据?
void send_byte(uchar buf_to_send) //发送采用查询方式 字节发送函数 { while( !(UCSR0A & (1<<UDRE0)) ); UDR0=buf_to_send; }
void send(void) /*发送函数*/ { uchar i; //PB0通过一反相器控制485的收发,高经过反相后为低,接收,低,经过反相后为高,发送 DDRB |= (1 << PB0);//设置PB0为输出. PORTB &= ~(1 << PB0);//PB0输出低电平 ,485发 _delay_ms(1); 。 。 。 。 。 。 for(i=0;i<(buf_send[9]+12);i++)/*发送*/ { send_byte(buf_send); }
_delay_ms(20); //最少要延时17及以上,否则为17时,最后一个就不完整,比15少的话会丢数据。 //PB0通过一反相器控制485的收发,高经过反相后为低,接收,低,经过反相后为高,发送 DDRB |= (1 << PB0);//设置PB0为输出. PORTB |= (1 << PB0);//PB0输出高电平 ,485收 } 原因正在查找中,哪位知道,不妨指点一二。 |