打印
[AVR单片机]

[讨论] atmeg16 UART怪异问题

[复制链接]
1339|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Farid|  楼主 | 2012-5-8 17:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <iom16v.h>
#include <macros.h>
#define  uchar unsigned char
#define  uint  unsigned int

#pragma interrupt_handler uart_rx:12
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()
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x01; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x00;

}
void uart_sendB(uchar data)
{
   while(!(UCSRA&(BIT(UDRE)))) ;
   UDR=data;
   while(!(UCSRA&(BIT(TXC))));
   UCSRA|=BIT(TXC);
}
void uart_rx()
{
    UCSRB&=~BIT(RXCIE);
        rdata=UDR;
        flag=1;
        UCSRB|=BIT(RXCIE);
}
void main()
{  
    uart_init();
        while(1)
        {
           if(flag)
           {
              uart_sendB(rdata);
                  flag=0;
           }
        }


}

我这样写可以通过串口助手发什么收什么,但是我现在想改用如下的:
比如当我收到0xAB的时候,我让串口回复给我0x88
我写成这样
void uart_rx()
{
    UCSRB&=~BIT(RXCIE);
        rdata=UDR;
       if(rdata == 0xAB)
              flag=1;
        UCSRB|=BIT(RXCIE);
}
void main()
{
    uart_init();
        while(1)
        {
           if(flag)
           {
              uart_sendB(0X88);
                  flag=0;
           }
        }        
}

但是当我发送0XAB的时候,串口没有任何回复,请问各位是怎么回事呢?
多谢!!

相关帖子

沙发
airwill| | 2012-5-9 08:49 | 只看该作者
思路上没有问题, 用调试看看
rdata == 0xAB 到底有没有成立, 感觉这里是最容易有问题的地方之一.

使用特权

评论回复
板凳
joyme| | 2012-5-9 11:53 | 只看该作者
这个代码是没有问题啊,你串口助手是不是设置为十六进制发送、接收

使用特权

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

本版积分规则

1

主题

12

帖子

1

粉丝