单片机用avr 的mega64,相关的操作如下:<br /><br />#define SERIAL1_SEND ( PORTG |= (1 << PG4))<br />#define SERIAL1_RECEIVE ( PORTG &= ~(1 << PG4))<br /><br />void uart1_printf(u8_t *p,u8_t length)<br />{<br /> SERIAL1_SEND;//发送使能<br /> cli();<br /> uart1TxWrite = 0;<br /> uart1TxRead = 0;<br /> while(length--)<br /> {<br /> uart1TxBuf[uart1TxWrite++] = *p++;<br /> }<br /> sei();<br /> UCSR1B |= (1<<UDRIE1); //开始发送<br />}<br /><br />ISR(USART1_UDRE_vect)<br />{<br /> UCSR1A |= (1 << TXC1);<br /> UDR1 = uart1TxBuf[uart1TxRead++];<br /> if (uart1TxRead >= uart1TxWrite)<br /> {<br /> uart1TxRead = 0;<br /> uart1TxWrite = 0;<br /> UCSR1B &= ~(1<<UDRIE1);<br /> UCSR1B |= (1<<TXCIE1);//发送完最后一个字节开启TX完成中断<br /> }<br />}<br /><br />ISR(USART1_TX_vect)<br />{<br /> UCSR1A |= (1 << TXC1);<br /> UCSR1B &= ~(1<<TXCIE1); // 关闭TX中断<br /> SERIAL1_RECEIVE;<br />}<br /><br /><br /><b>现在碰到的问题是:通信一段时间后,485的发送脚会一直处在高电平状态,导致通信无法继续下去(无法接收到数据)</b><br /><br />于是我在发送的时候,同时用一个IO接灯来显示发送状态,亮表示发送,灭表示接收:(共阳接法)<br />#define SERIAL1_SEND ( PORTG |= (1 << PG4);PORTF &= ~(1 << PF4);)<br />#define SERIAL1_RECEIVE ( PORTG &= ~(1 << PG4);PORTF |= (1 << PF4);)<br /><br /><b>发现,当485一直处于之前提到的错误状态时,我的发送灯是灭的,也就是程序已经退出了发送状态,而发送脚却还在发送状态(为何?)</b><br /><br />糊涂之中,恳请高人解答,谢谢。<br /> |
|