打印
[AVR单片机]

AVR串口通信疑难杂症

[复制链接]
2181|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
8385810|  楼主 | 2013-2-25 15:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 8385810 于 2013-2-25 16:31 编辑

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/iom128.h>

#define uchar unsigned char
#define uint  unsigned int

void uart0_init(void);
void uart0_send(unsigned char c);
void Usart_Sendstring(unsigned char *Str);
uchar RX_buffer[7];
uchar Tx_buffer[6];
static int i=0;
static int aflag=0;

/******************端口初始化***************************/
void port_init(void)
{ //端口设置
PORTA = 0x00;//LCD口,总线低八位地址
DDRA  = 0x00;

PORTB = 0x00;//SPI接口
DDRB  = 0xff;

PORTC = 0x00; //总线高八位地址
DDRC  = 0x00;

PORTD = 0x00;//USART1接口
DDRD  = 0x00;

PORTE = 0x0f;//键盘口
DDRE  = 0xf0;

PORTF = 0x00;//LED口
DDRF  = 0xff;

PORTG = 0xff;
DDRG  = 0xff;
}
/***************串口0初始化********************/
void uart0_init()
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x06;
UBRR0L = 0x33; //baud rate=9600
UBRR0H = 0x00; //
UCSR0B = 0x98;
}

/**************发送采用查询方式**************/
void uart0_send(unsigned char c)
{
  while( !(UCSR0A & (1<<UDRE0)) );
        UDR0=c;
}

/**************接收采用中断******************/
ISR(USART0_RX_vect)
{
char temp=0;//?GData*
temp=UDR0;
if((RX_buffer[0]=='?')||(temp=='?'))
        {
        RX_buffer[i++]=temp;
        if(temp=='*')
                {
                //TCCR0=00;
                aflag=1;
                i=0;
                }
        }
  if(i>8)
        {
        RX_buffer[0]='a';
        i=0;
        }
  
}
/********************************************/



void Usart_Sendstring(unsigned char *Str)
{
        while(*Str)
        {
        uart0_send(*Str++);
        
        }
}


int main(void)
{        
  cli();
  port_init();
  uart0_init();
  sei();
   
  while(1)
  {

  if(aflag)
        {
        Usart_Sendstring("1234");
        aflag=0;
        }
        
  }

}
我用串口调试工具发送字符串“?GData*”可为什么收不到“1234”

相关帖子

沙发
8385810|  楼主 | 2013-2-25 15:05 | 只看该作者
求高手指点!

使用特权

评论回复
板凳
airwill| | 2013-2-25 18:38 | 只看该作者
Txd 脚没有设置成输出

使用特权

评论回复
地板
yklstudent| | 2013-2-25 20:05 | 只看该作者
两处问题
1、优化所造成的问题
2、?和?的区别
所以楼主看不到回复1234

使用特权

评论回复
评分
参与人数 1威望 +8 收起 理由
qin552011373 + 8
5
8385810|  楼主 | 2013-2-25 20:45 | 只看该作者
能详细点吗?谢谢

使用特权

评论回复
6
8385810|  楼主 | 2013-2-25 20:51 | 只看该作者
yklstudent 发表于 2013-2-25 20:05
两处问题
1、优化所造成的问题
2、?和?的区别

2我能排除!请问怎么确定是优化的问题?谢谢

使用特权

评论回复
7
8385810|  楼主 | 2013-2-25 20:52 | 只看该作者
airwill 发表于 2013-2-25 18:38
Txd 脚没有设置成输出

我应该怎么改呢?谢谢

使用特权

评论回复
8
yklstudent| | 2013-2-25 22:14 | 只看该作者
8385810 发表于 2013-2-25 20:51
2我能排除!请问怎么确定是优化的问题?谢谢

/*
* atmega128_usart.c
*
* Created: 2013/2/25 18:22:31
*  Author: K.Yao
*/

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/iom128.h>

#define uchar unsigned char
#define uint  unsigned int

void uart0_init(void);
void uart0_send(unsigned char c);
void Usart_Sendstring(unsigned char *Str);
uchar RX_buffer[7];
uchar Tx_buffer[6];
volatile int i=0;
volatile int aflag=0;

/******************端口初始化***************************/
void port_init(void)
{ //端口设置
        PORTA = 0x00;//LCD口,总线低八位地址
        DDRA  = 0x00;

        PORTB = 0x00;//SPI接口
        DDRB  = 0xff;

        PORTC = 0x00; //总线高八位地址
        DDRC  = 0x00;

        PORTD = 0x00;//USART1接口
        DDRD  = 0x00;

        PORTE = 0x0f;//键盘口
        DDRE  = 0xf0;

        PORTF = 0x00;//LED口
        DDRF  = 0xff;

        PORTG = 0xff;
        DDRG  = 0xff;
}
/***************串口0初始化********************/
void uart0_init()
{
        UCSR0B = 0x00; //disable while setting baud rate
        UCSR0A = 0x00;
        UCSR0C = 0x06;
        UBRR0L = 0x33; //baud rate=9600
        UBRR0H = 0x00; //
        UCSR0B = 0x98;
}

/**************发送采用查询方式**************/
void uart0_send(unsigned char c)
{
        while( !(UCSR0A & (1<<UDRE0)) );
        UDR0=c;
}

/**************接收采用中断******************/
ISR(USART0_RX_vect)
{
        char temp;//?GData*
        temp=UDR0;
        if((RX_buffer[0]=='?')||(temp=='?'))
        {
                RX_buffer[i++]=temp;
                if(temp=='*')
                {
                        //TCCR0=00;
                        aflag=1;
                        i=0;
                }
        }
        if(i>8)
        {
                RX_buffer[0]='a';
                i=0;
        }
       
}
/********************************************/



void Usart_Sendstring(unsigned char *Str)
{
        while(*Str)
        {
                uart0_send(*Str++);
               
        }
}


int main(void)
{
        cli();
        port_init();
        uart0_init();
        sei();
       
        while(1)
        {

                if(aflag)
                {
                        Usart_Sendstring("1234");
                        aflag=0;
                }
               
        }

}
试试这个就知道了

使用特权

评论回复
评论
yuandm1 2013-7-31 09:52 回复TA
uchar RX_buffer[7]; uchar Tx_buffer[6]; volatile int i=0; volatile int aflag=0; 经过对比修改了这里,最近也遇到类似的问题,竟然问题解决了。太感谢了  
评分
参与人数 1威望 +2 收起 理由
qin552011373 + 2 很给力!
9
shu_007| | 2013-2-26 23:26 | 只看该作者
uchar buf[3]={0};
uchar i;
buf[i]=UCR;
if(buf[0]=='1')
{i=1;}
if(buf[1]=='2')
{i=2;}
if(buf[2]=='3')
{i=0;.........
}
if(buf[3]=='1')
{i=3;}

使用特权

评论回复
10
wentao0100| | 2013-4-3 14:09 | 只看该作者
厉害~~

使用特权

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

本版积分规则

1

主题

5

帖子

0

粉丝