附代码如下:
void TData(uint8_t *_usBuf, uint8_t _usLen) { uint8_t Tx_Status, Txread, Txwrite, Txcounter; uint16_t i; Txread =p_uart.Tx_read; Txcounter =p_uart.Tx_counter; //将待发送数据缓冲区写入UART发送数据缓冲区 for(i=0; i<_usLen;i++) { if(++Txread>= USART1_TX_BUF_SIZE) { Txread= 0; } if(++Txcounter>= USART1_TX_BUF_SIZE) //判断发送缓冲区数据个数 { Txcounter= 0; } p_uart.pTxBuf[p_uart.Tx_write]= _usBuf; if(++p_uart.Tx_write>= USART1_TX_BUF_SIZE) { p_uart.Tx_write= 0; } p_uart.Tx_counter++; } USART_ITConfig(USART1, USART_IT_TXE,ENABLE);
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) { USART_ClearITPendingBit(USART1,USART_IT_TXE); if(p_uart.Tx_read== p_uart.Tx_write) //没有新数据 { USART_ITConfig(USART1,USART_IT_TXE, DISABLE); USART_ITConfig(USART1,USART_IT_TC, ENABLE); } else { USART_SendData(USART1,p_uart.pTxBuf[p_uart.Tx_read]); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE == RESET)); if(++p_uart.Tx_read>= USART1_TX_BUF_SIZE) { p_uart.Tx_read = 0; } p_uart.Tx_counter--; }} else if(USART_GetITStatus(USART1, USART_IT_TC) !=RESET){ USART_ClearITPendingBit(USART1,USART_IT_TC); //清除发送完成标志位 if(p_uart.Tx_read == p_uart.Tx_write) //没有新数据 { USART_ITConfig(USART1, USART_IT_TC,DISABLE); //关闭发送完成中断 } else { USART_SendData(USART1,p_uart.pTxBuf[p_uart.Tx_read]); while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET); if(++p_uart.Tx_read>= USART1_TX_BUF_SIZE) { p_uart.Tx_read= 0; } p_uart.Tx_counter--; }}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);
这句话就应该去掉。
还有上边那句
发送中断本来就是为了节省死等时间的
一周热门 更多>