STM32串口的485收發(fā)控制角的電平控制
關(guān)于485電平控制,如果在發(fā)送中斷處理后邊直接電平轉(zhuǎn)換,會(huì)導(dǎo)致發(fā)送數(shù)據(jù)不全,如果加入一定延時(shí),然后在進(jìn)行電平轉(zhuǎn)換,可以解決這個(gè)問題,但略顯笨重。解決方法是開啟發(fā)送完成中斷:USART_IT_TC(Transmission complete interrupt)可以完成精準(zhǔn)控制,需要注意的是,這個(gè)中斷沒發(fā)送完一個(gè)字節(jié)都會(huì)產(chǎn)生,因此建議在最后一個(gè)字節(jié)裝入發(fā)送緩存器后再開啟。
void USART1_IRQHandler(void)
{
CPU_INT08U rx_data;
CPU_INT08U tx_data;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //串口1接收處理
{
rx_data = (USART_ReceiveData(USART1) & 0xFF);
// 放入通道1接收緩沖區(qū)循環(huán)隊(duì)列
if (!COM_CHANNEL_RXByteIn(BSP_RTU_CHANNEL_NO1, rx_data))
{
// 緩沖區(qū)滿,接收失敗
}
}
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) //串口1發(fā)送處理
{
if (COM_CHANNEL_TXByteOut(BSP_RTU_CHANNEL_NO1, &tx_data))
{
USART_SendData(USART1, tx_data);
}
else
{
USART_ITConfig(USART1, USART_IT_TXE, DISABLE); //關(guān)閉發(fā)送中斷
USART_ClearITPendingBit(USART1,USART_IT_TC);
USART_ITConfig(USART1, USART_IT_TC, ENABLE);
}
}
if(USART_GetITStatus(USART1, USART_IT_TC) != RESET) //串口1發(fā)送完成處理
{
USART_ITConfig(USART1, USART_IT_TC, DISABLE); //關(guān)閉發(fā)送中斷
GPIO_WriteBit(GPIOB, GPIO_Pin_5,Bit_RESET); //RX_ENABLE
}
}