STM32
直播中

王英

7年用户 1298经验值
私信 关注
[问答]

怎样去完成STM32串口接收不定长数据hal库的实验呢

怎样去完成STM32串口接收不定长数据hal库的实验呢?

回帖(1)

王淑兰

2021-12-7 14:57:55

//main.c
//最大256可以用宏定义其他大小是最好的
uint8_t aRxBuffer;                        //接收中断缓冲
uint8_t rxBuff[256];                //接收缓冲,可以宏定义
uint8_t rxCnt = 0;                //接收缓冲计数
uint8_t        overErr[] = "数据超过256rn";


  /* main()函数中使能接收,进入中断回调函数 */
  //每次接收完数据后会关闭接收,因而要重新使能一次
  //每次接收数据都会进入中断,但只有在接收的书目等于设定的size时才进入回调函数
  HAL_UART_Receive_IT(&huart1,&aRxBuffer,1);
//串口回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
/* Prevent unused argument(s) compilation warning */
  UNUSED(UartHandle);
        if(rxCnt >= 255)  //溢出判断,要注意溢出后的数据还是会接收进来
        {
                rxCnt = 0;
        //memset(void *buffer, int c, int count)  buffer:为指针或是数组, c:是赋给buffer的值,count:是buffer的长度.
        //清空数组.原型是memset(buffer, 0, sizeof(buffer))
                memset(rxBuff,0x00,sizeof(rxBuff));
                HAL_UART_Transmit(&huart1, (uint8_t *)&overErr, sizeof(overErr),0xFFFF);       
        }
        else
        {
                rxBuff[rxCnt++] = aRxBuffer;   //接收数据转存
                if((rxBuff[rxCnt-1] == 0x0A)&&(rxBuff[rxCnt-2] == 0x0D)) //判断结束位
                {
                        HAL_UART_Transmit(&huart1, (uint8_t *)&rxBuff, rxCnt,0xFFFF); //将收到的信息发送出去
                        rxCnt = 0;
                        memset(rxBuff,0x00,sizeof(rxBuff)); //清空数组
                }
        }       
        while(HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1)==HAL_OK);   //再开启接收中断
}
举报

更多回帖

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