打印
[AVR单片机]

求救 串口通信啊啊

[复制链接]
970|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
雨沛cap|  楼主 | 2013-11-23 17:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
谁能给我个能用的串口通信程序给我啊 顺便帮看一下我这个能用不 我是想返回一个八位的数据  但不管我发啥他都全部返回了  
#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;
           }
        }
       
        }
       
}

相关帖子

沙发
雨沛cap|  楼主 | 2013-11-23 17:13 | 只看该作者
还有 我怎么编一个中断处理程序 将接受到的 一组数据 放到一个数组里 然后校验数据是否符合 要是符合就赋给相应的 变量 这样对么
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);
                           }
}

使用特权

评论回复
板凳
lirunze| | 2013-11-23 21:02 | 只看该作者
这个要具体问题具体分析啊

使用特权

评论回复
地板
qin552011373| | 2013-11-24 09:44 | 只看该作者
uart_sendB(rdata);注定要全部返回,要不然还错了

使用特权

评论回复
5
雨沛cap|  楼主 | 2013-11-24 13:55 | 只看该作者
qin552011373 发表于 2013-11-24 09:44
uart_sendB(rdata);注定要全部返回,要不然还错了

我在那加了一个while(1)他不会停在那 么  我换过其他的停止方式 比如
while(!a)
{
uart_sendB(rdata);
a=1;
}
这个是执行一次么?我让他只返回一个数据  而不是全部返回 ,还有就是想问
while(1)
{
uart_sendB(0x11);
}
这样它不会一直返回 0x11么  为啥我啥都没有收到的

使用特权

评论回复
6
雨沛cap|  楼主 | 2013-11-24 13:58 | 只看该作者
lirunze 发表于 2013-11-23 21:02
这个要具体问题具体分析啊

嗯嗯 那我应该怎么接受一串数据 放到一个数组里呀  ?

使用特权

评论回复
7
qin552011373| | 2013-11-25 07:34 | 只看该作者
雨沛cap 发表于 2013-11-24 13:55
我在那加了一个while(1)他不会停在那 么  我换过其他的停止方式 比如
while(!a)
{

建议仔细分析一下程序,仔细想一想

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

0

粉丝