|
应该是在中断接收部分有错,原来程序中的case2应该象下面这部分这样,可是下载后上位机接收不到数据,除了刚开始发送的第一个数组。改了case2后(请见附录的程序)如果连续发送0xCC,每7个就能收到一个数据包,发送其他数据均不能收到数据包。
case 2:
if(data_temp==0x02)//判断是否为本机地址
r_counter=3;
else
r_counter=0;
break;
大家帮我看看哪里错了,多谢!
附录程序:
/*********************************************************
mega8与PC机通信程序,PC5控制SN75176B收发。
编程环境avr studio 4.12。
*********************************************************/
#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/signal.h>
#define uchar unsigned char
#define uint unsigned int
uchar data_receive[7];//接收到的数据
uint r_counter;//接收字节计数
uchar end_flag;//数据包发送完标志
uchar send_id;//发送正误标志
const uchar tdata_send[7]={0xCC,0xCC,0x02,0x00,0x00,0x00,0x02};//数据包正确发送的数组
const uchar fdata_send[7]={0xCC,0xCC,0x02,0x01,0x00,0x00,0x03};//数据包错误发送的数组
void delay(void)//延时函数
{
uint i,j;
for(i=0;i<100;i++)
for(j=0;j<1;j++);
}
/*************************
USART初始化
*************************/
void usart_init(void)
{
UCSRB=0x00;//设置波特率前关闭中断
UBRRL=0x06;
UBRRH=0x00;//设置波特率
UCSRB=0x98;//发送允许、接收允许、接收中断允许
UCSRC=0x86;//异步模式,1位停止位,8位数据位
}
void ClearCom(void)
{
char i=0,Temp;
for(i=0;i<3;i++) //缓冲区最大只有三个
{
if(UCSRA&0x80) Temp=UDR; //有数据就接收,也就是清缓冲区
else return ; //没有数据就返回,即清缓冲区
}
}
/******************************
中断接收函数
*******************************/
SIGNAL(SIG_UART_RECV)
{
uchar data_temp;//中间变量
uchar data_check;//校验码
data_temp=UDR;
if(end_flag==0)//数据处理完才接收
{
data_receive[r_counter]=data_temp;
switch(r_counter)
{
case 0:
if(data_temp==0xCC)//第一个校验字节
r_counter=1;
else
r_counter=0;
break;
case 1:
if(data_temp==0xCC)//第二个校验字节
r_counter=2;
else
r_counter=0;
break;
case 2:
//if(data_temp==0x02)//判断是否为本机地址
r_counter=3;
//else
//r_counter=0;
break;
case 3:
r_counter=4;
break;
case 4:
r_counter=5;
break;
case 5:
r_counter=6;
break;
case 6:
data_check=data_receive[2]^data_receive[3]^data_receive[4]^data_receive[5];//计算校验码
if(data_receive[6]==data_check)
send_id=0;
else
send_id=1;
r_counter=0;
end_flag=1;//接受完一个数据包
break;
}
}
else r_counter=0;
}
void usart_send(void)
{
uint i;
PORTC=0x20;//设置SN75176b为发送状态
switch(send_id)
{
case 0://数据正确时发送
for(i=0;i<7;i++)
{
while(!(UCSRA & (1<<UDRE)))
;
UDR=tdata_send;
}
break;
case 1://数据错误时发送
for(i=0;i<7;i++)
{
while(!(UCSRA &(1<<UDRE)))
;
UDR=fdata_send;
}
break;
default://默认情况发送错误数据包
for(i=0;i<7;i++)
{
while(!(UCSRA &(1<<UDRE)))
;
UDR=fdata_send;
}
break;
}
delay();
PORTC=0x00;//设置SN75176B为接收状态
}
void main(void)
{
sei();//开全局中断
usart_init();//初始化usart
DDRC=0xFF;//设置D口为输出
PORTC=0x00;//设置SN75176B为接收状态
r_counter=0;
end_flag=1;
send_id=1;
while(1)
{
if(end_flag==1)
{
usart_send();
//此处调用其他函数
end_flag=0;//标志清零,继续接收下一个数据包
}
}
}
-----此内容被xipu于2005-11-04,13:31:26编辑过 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|