1.HAL库定长接收
HAL_UART_Receive(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size,
uint32_t Timeout)
huart:句柄
pData:盛放接收数据的变量
Size:接收数据的大小
Timeout:超时多久返回
接收完成后产生中断的接收函数
HAL_UART_Receive_IT(UART_HandleTypeDef * huart, uint8_t * pData, uint16_t Size)
huart:句柄
pData:盛放接收数据的变量
Size:接收数据的大小
传输结束后触发中断
HAL_UART_Receive_IT和HAL_UART_Receive的区别就是:中断接收是有数据到了才去读;直接接收是直接读取,如果超时就返回
这两个接收函数都是定长接收,规定接收数据长度后,当发送字符数长度超过约束,会有吞字符现象;当发送字符未达到size,则存在缓冲区,字符数达到规定后发出,实验如下图:
2.空闲中断+接收中断
没有数据交互的时候,电平归于高电平,此时空闲中断标志位被置1。在数据线处于空闲的状态时(即数据传输结束),空闲中断被置1,空闲中断需要手动清零。
1.空闲中断的认识,空闲中断的允许要手动解除中断屏蔽
2.空闲中断必须手动清零,不然中断会一直置位,系统会不断进中断处理函数
3.所有的跟串口一相关的中断都会进串口一中断处理函数
当传输一个字符串时,利用空闲中断,那控制数据的完整传输,实现思路:开启空闲中断和接收中断,接收一个字符,触发接收中断,跳转中断函数,完成接收单个字符,继续读取下一位,当读取到最后一位数据,结束传输并进入空闲中断
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
//使用串口接收中断+空闲中断
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))// 1. 获得串口空闲中断标志
{
__HAL_UART_CLEAR_FLAG(&huart1,UART_CLEAR_IDLEF); // 2. 清除空闲中断标志
//3.这里写中断执行
HAL_UART_Transmit(&huart1,buf_recv,sizeof(buf_recv),1000);
len=0;
memset(buf_recv,0,sizeof(buf_recv));
}else
{
buf_recv[len]=USART1->RDR;
len++;
HAL_UART_Receive_IT(&huart1,buff,1);
}
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}
三.空闲中断+DMA
HAL_UART_Receive_DMA(&huart1,buf_ctl,64); //接收DMA使能
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE); //开启串口空闲中断
开启中断,实现不定长接收
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE))
{ // 1. 获得串口空闲中断标志
__HAL_UART_CLEAR_FLAG(&huart1,UART_CLEAR_IDLEF); // 2. 清除空闲中断标志
HAL_UART_DMAStop(&huart1); // 3. 清除->空闲->停止DMA
len = 64 - hdma_usart1_rx.Instance->CNDTR;
// 4. 设定的传输长度-剩余传输数量(DMA_CNDTRx)=实际长度
buf_ctl[len]='\0';
HAL_UART_Transmit(&huart1,buf_ctl,sizeof(buf_ctl),500);
memset(buf_ctl,0,sizeof(buf_ctl));
HAL_UART_Receive_DMA(&huart1, buf_ctl, 64);
// 6. 重新开启DMA
}
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */
/* USER CODE END USART1_IRQn 1 */
}