2.知识点
2.1多字节中断,接收指定字节数据
-
在STM32cubemx中开启串口全局中断。
-
在程序初始化编写接收中断函数。
-
启用接收中断回调函数。并要开启下一次中断接受函数,否则将不接收数据。
-
在串口全局中断服务函数调用接收中断函数。
HAL_UART_Receive_IT(&huart1,g_Comm1RxBuffer,8);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
//g_Comm1RxBuffe数据缓存区,串口接收到8字节触发中断,这儿将对接收到的数据进行处理
USART1DataRecv();
}
}
2.2 DMA加空闲中断回调函数接收不定量数据
-
在STM32cubamx中配置DMA通道。
-
在程序初始化编写使能空闲中断和串口DMA接收中断函数。
-
在串口全局中断服务函数调用自定义中断服务函数。
-
编写中断服务函数和空闲中断服务函数。
2.3串口空闲中断接受不定量数据
-
程序初始化编写空闲中断接收函数。
-
调用空闲中断回调函数。
__HAL_UART_ENABLE_IT(&huart3, UART_IT_IDLE); //使能IDLE中断
//DMA接收函数,此句一定要加,不加接收不到第一次传进来的实数据,是空的,且此时接收到的数据长度为缓存器的数据长度
HAL_UART_Receive_DMA(&huart3, g_Comm3RxBuffer, BUFFER_SIZE);//重新打开DMA接收,不然只能接收一次数据
void HAL_UART_IdleCpltCallback(UART_HandleTypeDef *huart)
{
//注意:大量数据时,temp、g_Comm3RxBuffer_lenth为uint32_t ,不能写uint8_t否则会超过254就出现问题了。
//在数据量明确并且少量的情况下可以用uint8_t。
uint32_t temp=0;
HAL_UART_DMAStop(&huart3); //停止DMA
temp = __HAL_DMA_GET_COUNTER(&hdma_usart3_rx);// 获取DMA中未传输的数据个数
g_Comm3RxBuffer_lenth = BUFFER_SIZE - temp; //总计数减去未传输的数据个数,得到已经接收的数据个数
//控制逻辑。。。。。。
//HAL_UART_Transmit(&huart3, g_Comm3RxBuffer,g_Comm3RxBuffer_lenth,1000); //
memset(g_Comm3RxBuffer,0,g_Comm3RxBuffer_lenth);
HAL_UART_Receive_DMA(&huart3, g_Comm3RxBuffer,BUFFER_SIZE);
}
void USER_UART_IRQHandler(UART_HandleTypeDef *huart)
{
//DMA的通道每个芯片会有差异,有些串口没有DMA,所以在这儿不写其他的接口,需要时添加即可。
if(huart->Instance==USART3)
{ // 判断是否是空闲中断
if(RESET != __HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE))
{ // 清除空闲中断标志(否则会一直不断进入中断)
__HAL_UART_CLEAR_IDLEFLAG(&huart3);
// 调用空闲中断处理函数
HAL_UART_IdleCpltCallback(huart);
}
}
}
HAL_UARTEx_ReceiveToIdle_IT(&huart5,Rxbuffer,1024);
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
if(huart->Instance==UART5)
{
//数据存到了Rxbuffer,长度为函数参数Size。
//HAL_UART_Transmit(&huart1,Rxbuffer,Size,100);
memset(Rxbuffer,0,sizeof(Rxbuffer));
HAL_UARTEx_ReceiveToIdle_IT(&huart5,Rxbuffer,1024);
}
}