STM32
直播中

七上八下

8年用户 812经验值
私信 关注
[问答]

请问一下基于STM32F103C8T6 HAL库该怎样去接收不定长数据呢

请问一下基于STM32F103C8T6 HAL库该怎样去接收不定长数据呢?

回帖(1)

王雪

2021-12-14 15:54:17
测试软件及硬件平台



  • CubeMX;
  • Keil5;
  • STM32F103C8T6;

代码记录

在程序一开始定义几个变量:

unsigned char  uRx_Data[255] = {0};    //存储数组
unsigned char  uLength =  0;    //接收数据长度
unsigned char aRxBuffer;        //接收临时数据
初始化代码

/* MCU Configuration--------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  
  /* USER CODE BEGIN Init */
  /* USER CODE END Init */
  
  /* Configure the system clock */
  SystemClock_Config();


  /* USER CODE BEGIN SysInit */       
  /* USER CODE END SysInit */


  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1);//打开接收中断
  /* USER CODE END 2 */
初始化过程中因为CubeMX只进行了开启中断的操作,并未打开接收中断,所以需要在MX_USART2_UART_Init();之后打开接收中断,打开的办法就是使用HAL_UART_Receive_IT();这个HAL库函数进行操作。
不定长接收代码


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//接收完成回调函数
{
        if(uLength >= 255)  //溢出判断
        {
                uLength = 0;
                memset(uRx_Data,0x00,sizeof(uRx_Data));
                //HAL_UART_Transmit(&huart2, (uint8_t *)uRx_Data, sizeof(uRx_Data),0xFFFF);       
        }
        else
        {
                uRx_Data[uLength++] = aRxBuffer;   //接收数据转存
       
                if((uRx_Data[uLength-1] == 0x0A)&&(uRx_Data[uLength-2] == 0x0D)) //判断结束位是否为rn
                {
                        HAL_UART_Transmit(&huart2, (uint8_t *)uRx_Data, uLength,0xFFFF); //将收到的信息发送出去
                        uLength = 0;
                        memset(uRx_Data,0x00,sizeof(uRx_Data)); //清空数组,需要在头文件添加#include "string.h"
                }
        }
       
        HAL_UART_Receive_IT(&huart2, (uint8_t *)&aRxBuffer, 1);   //再开启接收中断
}
不定长接收核心部分结束,代码测试可用。仅作记录,欢迎交流。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分