各位大侠看看这个Atmega128单片机接收数据代码有啥问题,谢谢!怀疑是中断接收那里

2019-03-24 20:48发布

#include<iom128v.h>
#include<macros.h>
#include<delay.h>
#define fosc 8000000
#define baud 4800
#define uchar unsigned char
#define uint unsigned int
char rev_buf[80];        //接收缓存     
/*uchar rev_start = 0;     //接收开始标志      
uchar rev_stop  = 0;     //接收停止标志     
uchar gps_flag = 0;      //GPS处理标志   
uchar change_page = 0;   //换页显示标志
*/   
uchar num = 0;           //
uchar rdata;
/******************************************
串口1初始化
*******************************************/
void uart0_init(void)
{

UCSR0B=0x00;//关闭USART0
UCSR0A=0x00;//u2x=0,不适应倍速传送
UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);//8位数据帧
UBRR0L=(fosc/16/(baud+1))%256;//UBRR异步正常情况下计算公式
UBRR0H=(fosc/16/(baud+1))/256;
SREG=BIT(7);
UCSR0B=(1<<RXEN0)|(1<<TXEN0);//接收使能,发送使能
DDRE|=BIT(1);
}
/**************************************************
往串口1发送 一个数据,其中c为要发送的字符
**************************************************/
void Usart0SendByte(uchar c)
{
         while(!(UCSR0A&(1<<UDRE0)));//表明发送器0准备就绪
         UDR0=c;


}
/*****************************************************
读取串口1缓冲中的一个字符,并作为函数返回值
*******************************************************/
uchar Usart0GetByte(void)
{
                while(!(UCSR0A&(1<<RXC0)));//接收结束
                return UDR0;

}
/*******************************************************
往串口1发送一串数据,其中str为要发送的字符串
*******************************************************/
void Usart0SendStr(uchar *s)
{
static char i=0;
while(*s)
  {
  Usart0SendByte(*s);
  s++;

   }
   Usart0SendByte(0x0a);//回车换行
   //putchar0(0x0d);

}
/******************************************
串口2初始化
*******************************************/
void uart1_init(void)
{

UCSR1B=0x00;//关闭USART0
UCSR1A=0x00;//u2x=0,不适应倍速传送
UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);//8位数据帧
UBRR1L=(fosc/16/(baud+1))%256;//UBRR异步正常情况下计算公式
UBRR1H=(fosc/16/(baud+1))/256;
SREG=BIT(7);
UCSR1B=(1<<RXEN1)|(1<<TXEN1);//接收使能,发送使能
DDRD|=BIT(3);

}
/**************************************************
往串口2发送 一个数据,其中c为要发送的字符
**************************************************/
void Usart1SendByte(uchar c)
{
         while(!(UCSR1A&(1<<UDRE1)));//表明发送器0准备就绪
         UDR1=c;


}
/*****************************************************
读取串口2缓冲中的一个字符,并作为函数返回值
*******************************************************/
uchar Usart1GetByte(void)
{
                while(!(UCSR1A&(1<<RXC1)));//接收结束
                return UDR1;

}
/*******************************************************
往串口1发送一串数据,其中str为要发送的字符串
*******************************************************/
void Usart1SendStr(uchar *s)
{
static char i=0;
while(*s)
  {
  Usart1SendByte(*s);
  s++;

   }


}
#pragma interrupt_handler uart1_rx_isr:31
void uart1_rx_isr(void)
{
                uchar rdata;
                uchar i=0;
                UCSR1A=(1<<RXC1)|(1<<UDRE1);
                UCSR1B=(1<<RXCIE1)|(1<<RXEN1);
                UCSR1B&=~BIT(RXCIE1);//先关接收中断
                rdata=UDR1;
                if(!(rdata==' '))
                {
                rev_buf[i++]=rdata;//用变量接收数据
                }
                i=0;
                Usart0SendStr(rev_buf);
                UCSR1B|=BIT(RXCIE1);//重新开接收中断重新开接收中断

}
/******************************************************
串口1的测试代码
********************************************************/
void main(void)
{

uart0_init();
uart1_init();

while(1)
{


}
       



       
       



} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
judge_l
1楼-- · 2019-03-25 00:11
串口初始化的时候,你没把串口中断位使能啊、、、

一周热门 更多>