STM32L4系列HAL库如何实现不定长字节接收

2019-07-14 15:49发布

最近接触使用了STM32L4系列产品(只支持HAL库),目前其它功能都调试差不多了。就在串口中断接收上有些问题。
希望过来人对操作方式给点指点指示,万分感激!
目前大致流程是这样的:
1、首先串口初始化,部分代码如下:
  Huart1.Instance        = COM1;
  Huart1.Init.BaudRate   = 115200;
  Huart1.Init.WordLength = UART_WORDLENGTH_8B;
  Huart1.Init.StopBits   = UART_STOPBITS_1;
  Huart1.Init.Parity     = UART_PARITY_NONE;
  Huart1.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
  Huart1.Init.Mode       = UART_MODE_TX_RX;
  if (HAL_UART_Init(&Huart1) != HAL_OK)
  {
    Error_Handler();
  }
  HAL_NVIC_SetPriority(COM1_IRQn, 0, 1);
  HAL_NVIC_EnableIRQ(COM1_IRQn);
  HAL_UART_Receive_IT(&Huart1,aRxBuffer1,1);

2、中断函数处理代码:
void USART1_IRQHandler(void)  
{  
     HAL_UART_IRQHandler(&Huart1);
}  

3、中断回调函数(接收数据、并开启下个接收中断),部分代码:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
   uint8_t ret = HAL_OK;        
   if(huart->Instance == COM1)   
   {
     //Temp = aRxBuffer1[0];   
     do  
     {  
       ret = HAL_UART_Receive_IT(&Huart1,aRxBuffer1,1); //重新使能中断  
     }while(ret != HAL_OK);  //等待接收所有字符   
     //HAL_UART_Receive_IT(&Huart1,aRxBuffer1,1);  
     usart1testcnt++;   
     Temp = aRxBuffer1[0];
     //此处把数据装到一个数组DATABUF中;
  }

现在的现象是这样的:
1、如果上位机给发送少于10个字节,没有发现会丢数据;
2、如果上位机发送多余10个字节,比如50个字节,就会在10个字节之后又不同程度的丢数,隔那么几个字节丢一个字节,暂未发现连续2个字节丢失;(已经验证与发送时间间隔无关)
3、如果中断每次接收100个字节//HAL_UART_Receive_IT(&Huart1,aRxBuffer1,100);  上位机发送100个字节都能接收完整不会丢失;

有点疑问:
1、为什么前10几个字节不会丢数?库代码正在研究中;

最重要的问题:
就HAL库,到底该如何实现不定长字节接收?望大家指导!各种思路都可以表达!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
zrl12123456
1楼-- · 2019-07-14 22:54
用标准库也行啊,采用定时器间隔方式。
Lucia_nie
2楼-- · 2019-07-15 04:42
DMA加串口空闲中断,很好用
牛牛爱吃草
3楼-- · 2019-07-15 07:19
你的中断处理上有些问题,HAL_UART_RxCpltCallback本身就是中断处理的一部分,在这个函数里调用 HAL_UART_Receive_IT(&Huart1,aRxBuffer1,1);是不妥的

HAL_UART_Receive_IT这个函数启动中断接收数据,设置完就返回了.

如果用时间间隔来分包要在接收字节的同时查看与上次接收数据的时间差
76r456546
4楼-- · 2019-07-15 10:26
 精彩回答 2  元偷偷看……
uvysdfydad
5楼-- · 2019-07-15 14:25
请问解决了吗? 我遇到了一样的问题,我想用dma+空闲中断接收,但是不知道怎么做
leopard530
6楼-- · 2019-07-15 19:00
求教 具体怎么做呢? 我没有找到相应的接口

一周热门 更多>