打印
[AVR单片机]

mega16和gsm串口通信

[复制链接]
990|12
手机看帖
扫描二维码
随时随地手机跟帖
沙发
wangch_sh| | 2014-10-5 13:29 | 只看该作者
程序有问题吧?

使用特权

评论回复
板凳
ddllxxrr| | 2014-10-5 19:41 | 只看该作者
一些标志该清的没有清

使用特权

评论回复
地板
qq4988| | 2014-10-9 11:31 | 只看该作者
应该是程序问题,最好贴一下部分程序

使用特权

评论回复
5
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);                                 //全局中断开放
}
这是设置的程序

使用特权

评论回复
6
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没清空啊,但是其他程序也没看见清的

使用特权

评论回复
7
sing146|  楼主 | 2014-10-10 16:45 | 只看该作者

使用特权

评论回复
8
qq4988| | 2014-10-10 17:04 | 只看该作者
sing146 发表于 2014-10-10 16:45
@qq4988 @ddllxxrr @wangch_sh

使用特权

评论回复
9
qq4988| | 2014-10-10 17:07 | 只看该作者
sing146 发表于 2014-10-10 16:43
接收采用中断方式
**************************************************************** ...

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

???

接收完一个字节,就接收完毕了???

使用特权

评论回复
10
sing146|  楼主 | 2014-10-11 00:19 | 只看该作者
qq4988 发表于 2014-10-10 17:07
UCSRB|=BIT(RXCIE);                //接收完毕中断使能

???

这是异步串口通信,字符一个一个传

使用特权

评论回复
11
qq4988| | 2014-10-11 10:09 | 只看该作者
sing146 发表于 2014-10-11 00:19
这是异步串口通信,字符一个一个传

字符都是一个一个传啊,来一个字节,进一次中断,来一个进一次,

使用特权

评论回复
12
joyme| | 2014-10-11 11:49 | 只看该作者
把延时、显示代码全部去掉,置标志位,专门开个显示的任务做显示。显示、延时执行完,数据早就发完了,肯定后面的数据就接收不到

使用特权

评论回复
13
sing146|  楼主 | 2014-10-11 13:54 | 只看该作者
joyme 发表于 2014-10-11 11:49
把延时、显示代码全部去掉,置标志位,专门开个显示的任务做显示。显示、延时执行完,数据早就发完了,肯定 ...

非常感谢,应该是这个问题,已经可以正常使用了

使用特权

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

本版积分规则

5

主题

16

帖子

0

粉丝