我想通过rs485发送和接收数据。我有一个stm32发现,我通过rs485连接到设备。因此,对于发送和接收,我必须激活和禁用DE,方向控制线
我不了解断言时间,它说我应该根据过采样时间(我有过采样16)来选择断言时间和断言时间。
我做了什么,而不是使用MCU上的Pin来实现rs485功能,而是使用了一个随机输出引脚,该引脚应该(根据我的说法)可以工作,但确实起作用,是我这样做:
while (1)
{
HAL_GPIO_WritePin(GPIOB,SHDN_Linear_Pin,GPIO_PIN_SET);
HAL_UART_Transmit_IT(&huart1, (uint8_t *)bufftx ,strlen(bufftx));
HAL_UART_Receive_IT(&huart1, buffrx, 10);
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
当我执行SET时,WritePin函数会起作用,它会发送数据,此后,它应转到下面的函数并重置PIN,以便我可以接收,但不能重置。也许我必须延迟一下,我会测试一下。
/* USER CODE BEGIN 4 */
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
HAL_GPIO_WritePin(GPIOB,SHDN_Linear_Pin,GPIO_PIN_RESET);
/* NOTE : This function Should not be modified, when the callback is needed,
the HAL_UART_TxCpltCallback could be implemented in the user file
*/
}
/* USER CODE END 4 */
但这是一种好方法,请问任何人可以解释一下我应该如何使用断言时间吗?在发送数据之前,我做得足够快以使DE线变低吗?
HAL_StatusTypeDef HAL_RS485Ex_Init
(UART_HandleTypeDef * huart, uint32_t Polarity, uint32_t
AssertionTime, uint32_t DeassertionTime
这是hal库的用户手册说的,应该使用它,我应该像在回调函数中一样使用它吗?
谢谢
答案 0 :(得分:0)
首先,您应该记住RS485是半双工接口,不能同时传输和接收数据。您正在使用不受阻碍的功能(由IT转移),因此此代码不正确:
while (1)
{
HAL_GPIO_WritePin(GPIOB,SHDN_Linear_Pin,GPIO_PIN_SET);
HAL_UART_Transmit_IT(&huart1, (uint8_t *)bufftx ,strlen(bufftx));
HAL_UART_Receive_IT(&huart1, buffrx, 10);
HAL_Delay(1000);
}
您应该先检查TX状态,然后再使用HAL_UART_Transmit
之类的阻止功能
while (1)
{
HAL_GPIO_WritePin(GPIOB,SHDN_Linear_Pin,GPIO_PIN_SET);
g_is_tx_complete = false;
HAL_UART_Transmit_IT(&huart1, (uint8_t *)bufftx ,strlen(bufftx));
while(!g_is_tx_complete)
{
}
HAL_UART_Receive_IT(&huart1, buffrx, 10);
HAL_Delay(1000);
}
第二,,我不知道您没有收到TX Complete中断。我没有看到所有代码,但您通过NVIC和控制寄存器保留了启用中断的功能,如下所示:
/* Enable RXNE interrupt */
USART_ITConfig(USART1, USART_IT_RXNE | USART_IT_TXC, ENABLE);
/* Enable USART1 global interrupt */
NVIC_EnableIRQ(USART1_IRQn);
,如果您使用HAL_UART_TxCpltCallback
HAL处理程序,则应确保USART1_IRQHandler
调用HAL_USART_IRQHandler
函数
void USART1_IRQHandler(void)
{
HAL_USART_IRQHandler(&huart1);
}