usart3:没有开启DMA模式,开启此功能必须使能timer1,而且中断发送数据时,总是产生idle故障标志。且总是接收到自己发出的数据。请问,1.怎样可以让idle故障标志不再产生?2.怎么可以让usart3串口可以自动接收自己发出的数据(即可全双工工作)? usart4:目前仅可以正常接收数据,发送数据总是不完整。开启timer15仍无效果。 希望大家帮助解决一下,在此先行谢过! |
我们先一个一个的来解决。 1、如何不自发自收,只要外部不短接到一块是不会发生自发自收的。如果方便最好还是上传一下工程。 2、发送不完整,发送的过程时什么样的?尽量不要在中断中进行数据发送。
static void MX_USART3_UART_Init(void) { / USER CODE BEGIN USART3_Init 0 / / USER CODE END USART3_Init 0 / / USER CODE BEGIN USART3_Init 1 / / USER CODE END USART3_Init 1 / huart3.Instance = USART3; huart3.Init.BaudRate = 115200; huart3.Init.WordLength = UART_WORDLENGTH_8B; huart3.Init.StopBits = UART_STOPBITS_1; huart3.Init.Parity = UART_PARITY_NONE; huart3.Init.Mode = UART_MODE_TX_RX; huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart3.Init.OverSampling = UART_OVERSAMPLING_16; huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart3.Init.ClockPrescaler = UART_PRESCALER_DIV1; huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart3) != HAL_OK) { Error_Handler(); } / USER CODE BEGIN USART3_Init 2 / // __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_FE); // __HAL_UART_CLEAR_FLAG(&huart3, UART_FLAG_ORE); __HAL_UART_ENABLE_IT(&huart3, UART_IT_ERR); __HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE); __HAL_UART_ENABLE(&huart3); HAL_UART_Receive_IT(&huart3, &U3_RxDat_Tmp, 1); / USER CODE END USART3_Init 2 / } static void MX_USART4_UART_Init(void) { / USER CODE BEGIN USART4_Init 0 / / USER CODE END USART4_Init 0 / / USER CODE BEGIN USART4_Init 1 / / USER CODE END USART4_Init 1 / huart4.Instance = USART4; huart4.Init.BaudRate = 9600; huart4.Init.WordLength = UART_WORDLENGTH_8B; huart4.Init.StopBits = UART_STOPBITS_1; huart4.Init.Parity = UART_PARITY_NONE; huart4.Init.Mode = UART_MODE_TX_RX; huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart4.Init.OverSampling = UART_OVERSAMPLING_16; huart4.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; huart4.Init.ClockPrescaler = UART_PRESCALER_DIV4; huart4.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart4) != HAL_OK) { Error_Handler(); } / USER CODE BEGIN USART4_Init 2 / __HAL_UART_ENABLE_IT(&huart4, UART_IT_ERR); __HAL_UART_ENABLE_IT(&huart4, UART_IT_RXNE); __HAL_UART_ENABLE(&huart4); U4_Rx_Enable(); HAL_UART_Receive_IT(&huart4, &U4_RxDat_Tmp, 1); / USER CODE END USART4_Init 2 / }
void USART3_4_IRQHandler(void) { / USER CODE BEGIN USART3_4_IRQn 0 / / USER CODE END USART3_4_IRQn 0 / HAL_UART_IRQHandler(&huart3); HAL_UART_IRQHandler(&huart4); / USER CODE BEGIN USART3_4_IRQn 1 / / USER CODE END USART3_4_IRQn 1 / } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART3) { HAL_UART_Receive_IT(&huart3, &U3_RxDat_Tmp, 1); if(__HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE) == SET) { __HAL_UART_CLEAR_IDLEFLAG(&huart3); } if(U3_Rx_Index >= U3_RXBUFFER_SIZE) U3_Rx_Index = U3_RXBUFFER_SIZE - 1; U3_RxBuf[U3_Rx_Index] = U3_RxDat_Tmp; U3_Rx_Index++; U3_Rx_Delay = 5; } else if(huart->Instance == USART4)//RS485 { HAL_UART_Receive_IT(&huart4, &U4_RxDat_Tmp, 1); if(U4_Rx_Index >= U4_RXBUFFER_SIZE) U4_Rx_Index = U4_RXBUFFER_SIZE - 1; U4_RxBuf[U4_Rx_Index] = U4_RxDat_Tmp; U4_Rx_Index++; U4_Rx_Delay = 5; } } void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART3) { __HAL_UART_CLEAR_IT(&huart3, UART_CLEAR_TCF); __HAL_UART_DISABLE_IT(&huart3, UART_IT_TC); } else if(huart->Instance == USART4) { __HAL_UART_CLEAR_IT(&huart4, UART_CLEAR_TCF); __HAL_UART_DISABLE_IT(&huart4, UART_IT_TC); U4_Rx_Enable(); HAL_UART_Receive_IT(&huart4, &U4_RxDat_Tmp, 1); } } void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART3) { HAL_UART_Receive_IT(&huart3, &U3_RxDat_Tmp, 1); __HAL_UART_CLEAR_IDLEFLAG(&huart3); // __HAL_UART_ENABLE_IT(&huart3, UART_IT_ERR); __HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE); } else if(huart->Instance == USART4) { __HAL_UART_CLEAR_IT(&huart4, UART_CLEAR_NEF); __HAL_UART_CLEAR_IT(&huart4, UART_CLEAR_FEF); __HAL_UART_CLEAR_IT(&huart4, UART_CLEAR_OREF); __HAL_UART_CLEAR_IT(&huart4, UART_CLEAR_TCF); __HAL_UART_DISABLE_IT(&huart4, UART_IT_TC); U4_Rx_Enable(); HAL_UART_Receive_IT(&huart4, &U4_RxDat_Tmp, 1); } }
如果想自发自收,在外部将串口的RX和TX短接即可。HAL库一般是接收完指定长度后退出中断,进入回调函数。发送数据不完整的情况,先用查询方式发送,确认正常,切换到中断。我怀疑是中断处理的问题。我看你的中断时串口3和串口4一块处理,是系统生成的,还是自己改的?
如果想自发自收,在外部将串口的RX和TX短接即可。HAL库一般是接收完指定长度后退出中断,进入回调函数 ...
[md]1。程序大部分自动生成的。 2。我就是不想发生自发自收的情况,才请教大佬的。 目前,就是不知道是什么原因导致的。 谢谢您。如果发现什么不对地方,还请不吝赐教。再次感谢!!
那个idle标志是硬件检测后产生的,你可以选择不理它,比方不开启idle中断。这样它对你没有影响。 想使用UART的自发自收的话,硬件上TXRX短接即可,不过你就不能收发都使用查询方式,这样实现不了。你可以发送使用DMA,接收采用轮训方式 或者都使用DMA方式。 至于UART4的发送问题,估计你哪里误判了,你现在是非DMA方式,发送无非发完一个发送下一个,直到发送完毕为止。你说接收,倒还有接收不及时产生溢出方面的问题。你再检查下代码。
1。程序大部分自动生成的。2。我就是不想发生自发自收的情况,才请教大佬的。
[md]感谢您的支持! 问题已经解决,初始化部分程序的问题。 已经修改。
那个idle标志是硬件检测后产生的,你可以选择不理它,比方不开启idle中断。这样它对你没有影响。
[md]感谢您的支持! 问题已经解决,初始化的问题!