单片机用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一直处于之前提到的错误状态时,我的发送灯是灭的,也就是程序已经退出了发送状态,而发送脚却还在发送状态(为何?)
糊涂之中,恳请高人解答,谢谢。
|