[应用相关] 关于STM32HAL库串口接受部分的一点疑惑

[复制链接]
594|6
 楼主| laocuo1142 发表于 2021-2-24 09:59 | 显示全部楼层 |阅读模式
背景:
       小弟最近在用103C8处理一个串口的通信问题,需要在200ms以内的时间区间上不断接受并处理均次约200字节的上位机数据,并反馈上位机接受结果(逻辑流水位 + OK or ER)。       数据格式:
       逻辑流水位:若干数据项[parm=value&parm=value][结束标志]

       作了简单的测试,如果使用HAL库的HAL_UART_Receive处理,当字符超过250字节后,频率达到150ms后会死机,应该是过载了。
       我大概有一个方案:
       1:Receive依旧是中断触发,批量接受的方式,不过改写一下HAL库的接受过程。逐字识别出几个关键字的index,放在数组里即可,不再进一步处理。
      2:之后对数据内容的识别、配对、计算、反馈异步放在中断外面,用两套buffer应对。

/////////////我的问题//////////////
1:我的方案可行否?
2:关于HAL_UART_Receive函数的while部分逻辑有疑问,想咨询一下大家。
    2-1:以下摘取了HAL_UART_Receive  函数部分主干代码,重点展示while部分




  • HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t timeout)
  • {
  •    //头部合规性验证部分略....
  •    uint16_t* tmp;
  •    uint32_t tickstart = 0U;
  •     if(huart->RxState == HAL_UART_STATE_READY)//判断是否有数据
  •    {
  •          huart->RxXferCount = Size;
  •          while(huart->RxXferCount > 0U)
  •            {
  •      /****9字节等处理略....*****/
  •     //持续Timeout时间。
  •       if(UART_WaitOnFlagUntilTimeout(huart, UART_FLAG_RXNE, RESET, tickstart, Timeout) != HAL_OK)
  •         {
  •              return HAL_TIMEOUT;//0x03U
  •          }
  •          //pData每循环一次接受一个DR寄存器的数据
  •          *pData++ = (uint8_t)(huart->Instance->DR & (uint8_t)0x00FF);
  •          huart->RxXferSize++;
  •          huart->RxXferCount--;
  •          }//while end
  •     }//if end
  • }


[color=rgb(51, 102, 153) !important]复制代码





    2-2:我的疑惑是建立在批量读取数据的基础上,即——如何保证每次恰好都能接到正确的数据?
       按照波特率115200在PCLK1为源的情况下,我记得好像是几百K的频率,可MCU的主频72MHz,远大于传输频率。
       按我的理解这里的while会在MCU的频率下持续执行,如果是这样的话,串口接受到的数据除了正确的数据外,应该会有大量空数据。但是实际上没有这些空数据,有人可以帮我解释一下原因吗?
wiba 发表于 2021-3-4 10:51 | 显示全部楼层
数据量并不大
zljiu 发表于 2021-3-4 10:57 | 显示全部楼层
应该有可行性
coshi 发表于 2021-3-4 11:00 | 显示全部楼层
我觉得这样做是可以的
aoyi 发表于 2021-3-4 11:04 | 显示全部楼层
可以自己做一个小的协议进行判定
drer 发表于 2021-3-4 11:07 | 显示全部楼层
大面上看方案没有问题
ayb_ice 发表于 2021-3-4 11:14 | 显示全部楼层
老实搞中断吧,中断接收到一个字节后,自己存入数组,分析,超时自己做

他这种逻辑比较适合你做主机,接收从机的数据
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1296

主题

6239

帖子

15

粉丝
快速回复 在线客服 返回列表 返回顶部