[AVR单片机] mega16和gsm串口通信

[复制链接]
 楼主| sing146 发表于 2014-10-4 10:48 | 显示全部楼层 |阅读模式
请问为什么我的串口接收数据只能接收一个呢,字符串只有第一位能收到
wangch_sh 发表于 2014-10-5 13:29 | 显示全部楼层
程序有问题吧?
ddllxxrr 发表于 2014-10-5 19:41 | 显示全部楼层
一些标志该清的没有清
qq4988 发表于 2014-10-9 11:31 | 显示全部楼层
应该是程序问题,最好贴一下部分程序
 楼主| sing146 发表于 2014-10-10 16:42 | 显示全部楼层
/*************************************************************
                               初始化程序
************************************************************/
void uart_init()
{   
    uint a;
    DDRB=0XFF;                       
    DDRD|=BIT(PD4)|BIT(PD5)|BIT(PD6)|BIT(PD1);
    PORTD&=~BIT(6);
        PORTD&=~BIT(WR);       
    UCSRA = 0x00;
    UCSRB = 0x00;
    UCSRC|= BIT(URSEL)|BIT(UCSZ0)|BIT(UCSZ1);   //选择UCSRC寄存器,异步模式,                        
        UBRR  = 0X47;                               //设置波特率为9600               
    UCSRB = BIT(TXEN)|BIT(RXEN)|BIT(RXCIE);    //接收、发送使能,接收中断使能
        SREG  |= BIT(7);                                 //全局中断开放
}
这是设置的程序
 楼主| sing146 发表于 2014-10-10 16:43 | 显示全部楼层
                   接收采用中断方式
****************************************************************/
#pragma interrupt_handler USART_Received_Ir:12
void USART_Received_Ir()
{
        UCSRB&=~BIT(RXCIE);        //关串口中断,防止中断嵌套
        while(!(UCSRA&(1<<RXC)));//等待接受数据
        rec_data[num]=UDR;
        num++;
        if(num>=200)
           {
             num=0;
           }
        else;
        //LCD_SHOW(0,0,rec_data);
        //delay_ms(1000);
    UCSRA|=1<<RXC;          //标志位写1就能清零 接收中断信号 表示将继续接收
        //LCD_COM(0X01);
    //delay_ms(5);
        UCSRB|=BIT(RXCIE);                //接收完毕中断使能

这是接收中断,但是接收到的数据是发出去的,是不是UDR没清空啊,但是其他程序也没看见清的
 楼主| sing146 发表于 2014-10-10 16:45 | 显示全部楼层
qq4988 发表于 2014-10-10 17:04 | 显示全部楼层
sing146 发表于 2014-10-10 16:45
@qq4988 @ddllxxrr @wangch_sh

qq4988 发表于 2014-10-10 17:07 | 显示全部楼层
sing146 发表于 2014-10-10 16:43
接收采用中断方式
**************************************************************** ...

UCSRB|=BIT(RXCIE);                //接收完毕中断使能

???

接收完一个字节,就接收完毕了???
 楼主| sing146 发表于 2014-10-11 00:19 | 显示全部楼层
qq4988 发表于 2014-10-10 17:07
UCSRB|=BIT(RXCIE);                //接收完毕中断使能

???

这是异步串口通信,字符一个一个传
qq4988 发表于 2014-10-11 10:09 | 显示全部楼层
sing146 发表于 2014-10-11 00:19
这是异步串口通信,字符一个一个传

字符都是一个一个传啊,来一个字节,进一次中断,来一个进一次,
joyme 发表于 2014-10-11 11:49 | 显示全部楼层
把延时、显示代码全部去掉,置标志位,专门开个显示的任务做显示。显示、延时执行完,数据早就发完了,肯定后面的数据就接收不到
 楼主| sing146 发表于 2014-10-11 13:54 | 显示全部楼层
joyme 发表于 2014-10-11 11:49
把延时、显示代码全部去掉,置标志位,专门开个显示的任务做显示。显示、延时执行完,数据早就发完了,肯定 ...

非常感谢,应该是这个问题,已经可以正常使用了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

16

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部