求救 avr串口通信啊啊
#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define mclk 8000000
#pragma interrupt_handler uart_rx:12
int a=1;
uchar rdata,flag=0;
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
void uart_init(uint baud)
{
UCSRB=0x00;
UCSRA=0x00; //控制寄存器清零
UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);
//选择UCSRC,异步模式,禁止
// 校验,1位停止位,8位数据位
baud=mclk/16/baud-1 ; //波特率最大为65K
UBRRL=baud;
UBRRH=baud>>8; //设置波特率
UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
//接收、发送使能,接收中断使能
SREG=BIT(7); //全局中断开放
DDRD|=0X02; //配置TX为输出(很重要)
}
void uart_sendB(uchar data)
{
while(!(UCSRA&(BIT(UDRE)))) ;
UDR=data;
while(!(UCSRA&(BIT(TXC))));
UCSRA|=BIT(TXC);
}
void uart_rx()
{
flag=1;
UCSRB&=~BIT(RXCIE);
rdata=UDR;
UCSRB|=BIT(RXCIE);
//a=0;
}
void main()
{
uart_init(19200);
while(1)
{
{
if(flag)
{
// uart_sendB(0x55);
uart_sendB(rdata);
while(1);
flag=0;
}
}
}
}
还有 我怎么编一个中断处理程序 将接受到的 一组数据 放到一个数组里 然后校验数据是否符合 要是符合就赋给相应的 变量 这样对么
void uart_rx()
{
short leng;
uint i,sum=0;
UCSRB&=~BIT(RXCIE);
temp[count++]=UDR;
leng=temp[3];
if((temp[1]==0xff)&&(temp[2]==0xff))
{
for(i=0;i<leng-2;i++)
{
sum=temp[i+3]+sum;
}
if(temp[leng]==~(sum%256))
{
switch(temp[4])
{
case 1:
Red=temp[5];
Green=temp[6];
Blue=temp[7];
Brightnessnew=temp[8];
scene=COLOR;
break;
case 2 :
Brightnessnew=temp[5];
scene=BRIGHTNESS;
break;
case 3 :
MENU=temp[5];
if(MENU==0x01)
scene=HAPPY;
if(MENU==0x02)
scene=EXCITE;
if(MENU==0x03)
scene=UPSET;
break;
case 4 :
MENU=temp[5];
if(MENU==0x01)
scene=READ;
if(MENU==0x02)
scene=SLEEP;
if(MENU==0x03)
scene=PARTY;
if(MENU==0X04)
scene=RAMANTIC;
break;
case 5 :
Red=temp[5];
Green=temp[6];
Blue=temp[7];
TIME=temp[8];
scene=CLOCK;
break;
}
temp[leng]=0;
}
temp[1]=0;
temp[2]=0;
flag=1;
}
else
{
flag=0;
count=0;
UCSRB|=BIT(RXCIE);
}
}