打印

请教一个485收发转换的问题(相当迷糊)

[复制链接]
2185|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kanprin|  楼主 | 2008-12-5 17:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机用avr 的mega64,相关的操作如下:

#define SERIAL1_SEND         ( PORTG |= (1 << PG4))
#define SERIAL1_RECEIVE      ( PORTG &= ~(1 << PG4))

void uart1_printf(u8_t *p,u8_t length)
{
    SERIAL1_SEND;//发送使能
    cli();
    uart1TxWrite = 0;
    uart1TxRead = 0;
    while(length--)
        {
        uart1TxBuf[uart1TxWrite++] = *p++;
    }
    sei();
    UCSR1B |= (1<<UDRIE1);    //开始发送
}

ISR(USART1_UDRE_vect)
{
    UCSR1A |= (1 << TXC1);
    UDR1 = uart1TxBuf[uart1TxRead++];
    if (uart1TxRead >= uart1TxWrite)
    {
    uart1TxRead = 0;
    uart1TxWrite = 0;
    UCSR1B &= ~(1<<UDRIE1);
    UCSR1B |= (1<<TXCIE1);//发送完最后一个字节开启TX完成中断
    }
}

ISR(USART1_TX_vect)
{
    UCSR1A |= (1 << TXC1);
    UCSR1B &= ~(1<<TXCIE1);    // 关闭TX中断
    SERIAL1_RECEIVE;
}


现在碰到的问题是:通信一段时间后,485的发送脚会一直处在高电平状态,导致通信无法继续下去(无法接收到数据)

于是我在发送的时候,同时用一个IO接灯来显示发送状态,亮表示发送,灭表示接收:(共阳接法)
#define SERIAL1_SEND     ( PORTG |= (1 << PG4);PORTF &= ~(1 << PF4);)
#define SERIAL1_RECEIVE  ( PORTG &= ~(1 << PG4);PORTF |= (1 << PF4);)

发现,当485一直处于之前提到的错误状态时,我的发送灯是灭的,也就是程序已经退出了发送状态,而发送脚却还在发送状态(为何?)

糊涂之中,恳请高人解答,谢谢。

相关帖子

沙发
chunyang| | 2008-12-5 17:58 | 只看该作者

在理解器件工作过程的基础上,绘制出你的详细程序流程

如此很容易找到问题,关键是养成良好的习惯,编程前就应首先制定详细的程序流程。

使用特权

评论回复
板凳
xwj| | 2008-12-5 18:02 | 只看该作者

把你的485收发控制脚接那个灯的控制脚上:-)

使用特权

评论回复
地板
kanprin|  楼主 | 2008-12-5 23:44 | 只看该作者

re:

多谢两位的支持。
关于流程图,我知道这是一个很好的习惯。
只是觉得麻烦,基本都不写。
不过我一般都是先整理好思路后再写程序的。

to: xwj,如果用485控制的脚直接接灯,好像没啥用吧?
因为出现这个状态的时候,我用万用表和示波器都量过了,
该控制脚是高电平的,而平时的波形正常。

程序简单流程:

uart1_printf();
//将485切为发送状态
//函数把需要发送到数据堆到发送缓冲区,
//当所需发送的数据准备充分后,开启UART1的数据寄存器空中断,开始发送数据

ISR(USART1_UDRE_vect)
//UART1的发送中断,只要uart1TxRead小于uart1TxWrite,即还有数据没发送
//即把数据往发送寄存器上送,同时读指针加1
//当发送读指针与写指针相等时,即数据发送完成,关闭寄存器为空中断,开启发送完成中断,准备结束发送

ISR(USART1_TX_vect)
//将发送完成中断关闭,把485切换为接收状态

对于流程方面(思路)还有什么不对的,还请chunyang前辈指出,我现在只能是怀疑硬件方面会不会有什么问题? 谢谢大家关注

使用特权

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

本版积分规则

39

主题

343

帖子

0

粉丝