STM32F103串口接收数据,多字节触发中断接收数据,DMA空闲中断接受,空闲中断触发中断。

2.知识点

2.1多字节中断,接收指定字节数据

  1. 在STM32cubemx中开启串口全局中断。

  2. 在程序初始化编写接收中断函数。

  3. 启用接收中断回调函数。并要开启下一次中断接受函数,否则将不接收数据。

  4. 在串口全局中断服务函数调用接收中断函数。

image-20230626143225682

image-20230626143350788

image-20230626143847991

image-20230626143548047

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加空闲中断回调函数接收不定量数据

  1. 在STM32cubamx中配置DMA通道。

  2. 在程序初始化编写使能空闲中断和串口DMA接收中断函数。

  3. 在串口全局中断服务函数调用自定义中断服务函数。

  4. 编写中断服务函数和空闲中断服务函数。

image-20230626145043625

image-20230626145125520

image-20230626145424711

 

2.3串口空闲中断接受不定量数据

  1. 程序初始化编写空闲中断接收函数。

  2. 调用空闲中断回调函数

image-20230626145746276

__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);                       
        }
    }   
}

image-20230626145956625

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); 
  }
}

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32F103上实现串口接收数据可以通过以下步骤完成: 1. 配置串口硬件:首先,确保已经启用了所需的串口模块(USART1、USART2等)。然后,根据需要配置串口的波特率、数据位、停止位和奇偶校验位等参数。 2. 初始化串口:使用适当的库函数初始化串口,例如使用CubeMX生成的代码可通过调用`HAL_UART_Init()`函数来完成初始化。 3. 启动串口接收中断:使用适当的库函数配置并启动串口接收中断。例如,使用HAL库时,可以调用`HAL_UART_Receive_IT()`函数启动中断接收。 4. 实现中断处理函数:在中断处理函数中,使用适当的库函数读取接收缓冲区中的数据,并进行相应的处理。例如,在HAL库中,可以使用`HAL_UART_RxCpltCallback()`函数处理接收完成事件。 5. 处理接收到的数据:根据应用需求,对接收到的数据进行适当的处理,例如解析数据包、执行相应操作等。 以下是一个简单的示例代码,演示如何实现串口接收数据: ```c #include "stm32f1xx_hal.h" UART_HandleTypeDef huart1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); uint8_t rxData; // 接收数据的变量 while (1) { if (HAL_UART_Receive(&huart1, &rxData, 1, HAL_MAX_DELAY) == HAL_OK) { // 在这里处理接收到的数据 } } } void SystemClock_Config(void) { // 系统时钟配置,根据需要进行设置 } static void MX_GPIO_Init(void) { // GPIO初始化,根据需要进行设置 } static void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 115200; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } } void Error_Handler(void) { // 错误处理,根据需要进行设置 } void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if (huart == &huart1) { // 在这里处理接收完成事件 // 可以在这里使用huart1.RxXferCount和huart1.pRxBuffPtr访问接收缓冲区 HAL_UART_Receive_IT(&huart1, &rxData, 1); // 启动下一次接收 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值